首页 > 解决方案 > TCP/IP 客户端向服务器发送多条消息

问题描述

我正在使用此代码在客户端和服务器之间进行通信,现在我需要并且正在努力解决的是如何使服务器接受来自客户端的多条消息;并且客户端和服务器之间的通信不是 1 条客户端消息,然后是 1 条服务器消息,而是他们可以按每个顺序写入。

我怎样才能做到这一点?

谢谢

这是我的代码:

public class GossipServer {

    public static void main(String[] args) throws Exception{
        //create a server socket 
        ServerSocket sersock = new ServerSocket(3000);
        System.out.println("Server  ready for chatting");
        Socket sock = sersock.accept();        
        System.out.println("Client accepted information"+sock.getInetAddress()+sock.getPort());

        // reading from keyboard (keyRead object)
        BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(""+keyRead.toString());

        // sending to client (pwrite object)
        OutputStream ostream = sock.getOutputStream(); 
        PrintWriter pwrite = new PrintWriter(ostream, true);
        System.out.println("output stream "+ostream.toString());

        // receiving from client ( receiveRead  object)
        InputStream istream = sock.getInputStream();
        BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
        System.out.println("input stream "+istream.toString());

        //receiving message.    send message  
        String receiveMessage, sendMessage;               
        while(true) {
            if((receiveMessage = receiveRead.readLine()) != null ) {
                System.out.println(receiveMessage); }     

                sendMessage = keyRead.readLine(); 
                pwrite.println(sendMessage);             
                pwrite.flush();

            }
        }                                      
    }
}

客户 :

public class GossipClient {

    public static void main(String[] args) throws Exception {
        Socket sock = new Socket("127.0.0.1", 3000);
        // reading from keyboard (keyRead object)
        BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
        // sending to client (pwrite object)
        OutputStream ostream = sock.getOutputStream(); 
        PrintWriter pwrite = new PrintWriter(ostream, true);

        // receiving from server ( receiveRead  object)
        InputStream istream = sock.getInputStream();
        BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));

        System.out.println("Start the chitchat, type and press Enter key");

        String receiveMessage, sendMessage;               
        while(true) {
            sendMessage = keyRead.readLine();  // keyboard reading
            pwrite.println(sendMessage);       // sending to server
            pwrite.flush();                    // flush the data
            if((receiveMessage = receiveRead.readLine()) != null) //receive from server {
                System.out.println(receiveMessage); // displaying at DOS prompt
            }         
        }               
    }                  
}

标签: javasocketstcpip

解决方案


首先,这个答案不是关于如何解决您的问题的指南,而是更详细的解释您必须解决的问题,包括一些建议和想法。

现在让我们谈谈阻塞操作。BufferedReader::readLine使用example 方法从 InputStream 读取就是这样的阻塞操作。这意味着它将阻塞整个线程,直到它返回。把它想象成一个while循环。

现在为了绕过这个限制,你可以创建一个新线程,它只会监听流并打印出它接收到的任何内容。我个人在一些小型项目和测试中使用了这个,因为它在服务器端的每个连接总是需要两个线程。

如果您只想要一个小型点对点聊天应用程序,我会采用这种方法,因为它更容易理解(在我看来)并且足够复杂以处理您的问题。


但是,如果您想要一个有数千名用户同时聊天的大型聊天室,我会遵循 java.nio 包中引入的频道方法。

但是,由于我还没有深入了解核心 API 的这些领域,因此我无法提供有关它的更具体信息。


推荐阅读