簡體   English   中英

TCP / IP客戶端向服務器發送多個消息

[英]TCP/IP Client sending multiple messages to Server

我正在使用此代碼在客戶端和服務器之間進行通信,現在我需要而且正在努力解決的問題是如何使服務器接受來自客戶端的多個消息。 並且客戶端與服務器之間的通信不是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
            }         
        }               
    }                  
}

首先,此答案將不是解決問題的指南,而是更多詳細的解釋,包括一些建議和想法。

現在讓我們談談阻塞操作。 例如,使用BufferedReader::readLine方法從InputStream進行讀取就是這種阻塞操作。 這意味着它將阻塞整個線程,直到返回為止。 可以將其想像為while循環。

現在,為了繞過此限制,您可以創建一個新線程,該線程將僅偵聽流並打印出接收到的任何內容。 我親自在一些小型項目和測試中進行了此操作,因為在服務器端,每個連接總是需要兩個線程。

如果您只想要一個小的點對點聊天應用程序,我會采用這種方法,因為它更容易理解(我認為),並且足夠復雜以解決您的問題。


但是,如果您想與數千名用戶同時聊天的大型聊天室,我將遵循java.nio包中引入的通道方法。

但是,由於我還沒有深入研究核心API的這些領域,因此無法提供有關它的更具體的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM