簡體   English   中英

無法通過套接字發送多個消息

[英]Can't send multiple messages via socket

我正在嘗試建立一個小型聊天系統。 我有一個控制台和一個客戶端。 現在,只有客戶端需要將消息發送到控制台。 我可以成功連接到服務器,並且可以從客戶端向控制台發送一條消息。 發送第一條消息后,故障開始。 當第一個消息我不能發送任何其他消息。

我不知道是控制台不會讀取消息還是客戶端不會發送消息。 在這種情況下,我該如何解決?

public class ClientMainClass {


private static Socket socket;
public static void main(String args[]) {
    try {

        String host = "localhost";
        int port = 25000;
        InetAddress address = InetAddress.getByName(host);
        socket = new Socket(address, port);

        Scanner scanner = new Scanner(System.in);
        System.out.println("Skriv dit username:");
        String name = scanner.nextLine();
        System.out.println("Du er logget ind som: " + name);
        String input;

        do{
            input = scanner.nextLine();
            if (input.equalsIgnoreCase("exit")) {
                System.out.println("Du forlod serveren");
                socket.close();
                continue;
            }else {
                /*OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);*/
                PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
                Date date = new Date();
                String time = date.getDate()+"/"+date.getMonth()+":"+date.getHours()+":"+date.getMinutes();
                //Send the message to the server
                String message = time+ " - " + name + ": "+input;
                printWriter.println(message);
                System.out.println(message);
                continue;
            }
        }while (!(input.equals("exit")));
    } catch (Exception exception) {
        exception.printStackTrace();
    } finally {
        //Closing the socket
        try {
            socket.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
}

我的服務器:

public class Main{

private static Socket socket;

public static void main(String[] args) {


    try {

        int port = 25000;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server Started and listening to the port 25000");

        while(true) {
            //Reading the message from the client
            socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            System.out.println(br.readLine());
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            socket.close();
        } catch(Exception e){}
    }
}
}

要清楚。 我可以連接到服務器。 我可以從客戶端向控制台發送一條消息,但最多只能發送一條消息。

您從不讀第二行。 您的服務器接受一個連接,從該連接中讀取一條線,然后等待新的連接,並丟棄可能到達第一個連接的所有內容。

但是,您的客戶端使用第一個(也是唯一的)連接發送所有輸入,這是絕對正確的。

這個特定的問題可以這樣解決:

while(true) {
  //Reading the message from the client
  socket = serverSocket.accept();
  InputStream is = socket.getInputStream();
  InputStreamReader isr = new InputStreamReader(is);
  BufferedReader br = new BufferedReader(isr);
  while(true){
    System.out.println(br.readLine());
  }
}

這將使您的程序打印到達第一個連接的所有內容,但絕不會接受第二個連接。

為了處理多個客戶端,您需要一個Thread來處理每個客戶端。

暫無
暫無

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

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