当前位置: 首页 > 知识库问答 >
问题:

Java TCP在同一套接字上在客户端和服务器端之间发送和接收多个消息

堵彬彬
2023-03-14

我有以下情况,

  1. TCP服务器将接受来自客户端的连接
  2. 客户端将发送第一个请求,服务器将响应该请求,服务器必须在同一套接字上等待接收来自同一客户端的下一个请求
  3. 请参阅我所做的代码,使用此代码,服务器无法接收服务器发送的第二个请求,而客户端也在第二个接收中接收来自服务器的第一个响应。
  4. 请对此提出建议,代码中的问题是什么。
  5. 我试着模拟这个案例,如果有人以前遇到过,请尽快建议。
public class Client_MultipleMessages {
    public static void main(String[] args) {
        Socket clientSocket = null;
        SocketAddress sockaddr = null;
        boolean IsSocketCreated = false;
        String p_Response = "";
        OutputStream outToServer = null;
        InputStream in = null;
        String strRequestString = "";
        try{
            clientSocket = new Socket();
            sockaddr = new InetSocketAddress("192.168.121.121", 1234);
            try{
                clientSocket.connect(sockaddr, 1000);
                if (clientSocket.isConnected()){
                    IsSocketCreated = true;
                }
            }catch(Exception e){
                System.out.println("Exception while creating socket,Reason is:"+ e.getMessage());
            }
            int index = 1;
            String req = "REGISTRATION_REQUEST";
            while(index <= 2){
                if(clientSocket.isConnected()){
                    outToServer = clientSocket.getOutputStream();
                    System.out.println("Request "+index+":"+req);
                    outToServer.write(req.getBytes());
                    outToServer.flush();
                    //clientSocket.setSoTimeout(1000);
                    in = clientSocket.getInputStream();
                    int i = -1;
                    while((i = in.read()) > 0){
                        p_Response += (char) i;
                    }
                    System.out.println("Response "+index+":"+p_Response);
                }
                index++;
                req = "LERGD_ALLOCATE_MSISDN";
            }   
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
public class Server_MultipleMessages {
    public static void main(String[] args) {
        try{
            ServerSocket Server = new ServerSocket (1234);
            while(true){
                Socket socket = Server.accept();
                String fromclient = "";
                BufferedReader inFromClient = null;
                PrintWriter outToClient = null;
                String strresponse = "";
                try{
                    int reqCount = 1;
                    socket.setSoTimeout(2000);
                    while(reqCount <= 2){
                        System.out.println("Request-"+reqCount);
                        inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        outToClient = new PrintWriter(socket.getOutputStream(),true);
                        char data[] = new char[1200];
                        inFromClient.read(data);
                        for (int i = 0; i < data.length; i++) {
                            fromclient = fromclient + Character.toString(data[i]);
                        }
                        System.out.println("XML Request is from client: "+fromclient+"\n\n");
                        String returnDesc = "success";
                        if(fromclient.contains("REGISTRATION_REQUEST")){
                            System.out.println("Request if for Registeration !!");
                            strresponse = "<REGISTRATION_RESPONSE><HEADER><ERROR_CODE>" + 0 + "</ERROR_CODE>              <ERROR_DESC>" + returnDesc + "</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>";
                    }else if(fromclient.contains("LERGD_ALLOCATE_MSISDN")){
                        System.out.println("Request is for allocate Msisdnm !!");
                        strresponse = "<RESPONSE><HEADER><TRANSACTION_ID>123456</TRANSACTION_ID><REQUEST_TYPE>LERGD_ALLOCATE_MSISDN</REQUEST_TYPE><ERROR_CODE>" + 0 + "</ERROR_CODE><ERROR_DESC>" + returnDesc + "</ERROR_DESC></HEADER><BODY><ACTION_TAKEN>B</ACTION_TAKEN><ALLOCATED_MSISDN>7525600000</ALLOCATED_MSISDN></BODY></RESPONSE>";
                    }else{
                        System.out.println("Invalid Request from client !!");
                    }
                    System.out.println("XML Response to be send to client: "+strresponse+"\n\n");
                    outToClient.print(strresponse);
                    outToClient.flush();
                    strresponse = "";
                    fromclient = "";
                    reqCount++;
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }finally{
                if(!socket.isClosed()){
                    socket.close();
                }
            }
        }
    }catch(Exception ex){
        System.out.println("Error in ProcessXmlRequest : "+ex.getMessage());
    }
}}
Request-1
XML Request is from client: REGISTRATION_REQUEST
Request if for Registeration !!
XML Response to be send to client: <REGISTRATION_RESPONSE><HEADER><ERROR_CODE>0</ERROR_CODE><ERROR_DESC>success</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>
Request-2
java.net.SocketTimeoutException: Read timed out
Request 1:REGISTRATION_REQUEST
Response 1:<REGISTRATION_RESPONSE><HEADER><ERROR_CODE>0</ERROR_CODE><ERROR_DESC>success</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>
Request 2:LERGD_ALLOCATE_MSISDN
Response 2:<REGISTRATION_RESPONSE><HEADER><ERROR_CODE>0</ERROR_CODE><ERROR_DESC>success</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>

共有1个答案

吕向荣
2023-03-14

您的客户端读取响应直到流结束,这只在对等端关闭套接字时才发生,这使得不可能有多个交换。您需要设计另一种方式来分隔消息。在这种情况下,只需发送和接收线路就足够了。

 类似资料:
  • 我有一个java服务器应用程序,可以通过与多个客户端通信。在这个通道上,客户端发送请求,服务器发送应答。现在我想添加一个功能,服务器可以将文件发送到客户端。我不想通过用于通信的套接字发送,所以在一个客户端和一个服务器之间使用更多套接字是个好主意吗?如果是,如何处理?我用过这样的东西吗? 还是有更好的办法?

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套

  • 我最近开始学习php套接字。我想在服务器和客户端之间创建一个永久传输控制协议!但是我的PHP套接字客户端只发送和接收一条消息。我想无限期地发送和接收消息,通过一个连接。 服务器php: 客户php:

  • 问题内容: 我有一个C ++服务器和两个客户端(红宝石和Java)。一切都在64位linux机器(java 1.7.0_17)上运行。ruby客户端可以正常工作,但是java版本会出现问题。 在Java中,我尝试将字符串从客户端发送到服务器。实际上,服务器收到了整个字符串,但是服务器认为还有更多东西要接收。 红宝石客户端看起来像这样: 这里的一切工作正常。红宝石客户端发送一个字符串。服务器接收该字

  • 我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出