无法通过套接字发送多条消息

时间:2016-03-21 16:02:05

标签: java sockets

我正在尝试制作一个小聊天系统。我有一个控制台和一个客户端。现在只有客户端需要向控制台发送消息。我可以成功连接到服务器,我可以从客户端向控制台发送一条消息。发送第一条消息后,麻烦就开始了。当第一条消息我无法发送任何其他消息时。

我不知道是否是无法读取消息的控制台或不会发送消息的客户端。在这种情况下,我怎么能解决这个问题?

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){}
    }
}
}

要清楚。我可以连接到服务器。我可以从客户端向控制台发送一条消息,但只能发送一条消息。

1 个答案:

答案 0 :(得分:4)

你从未读过第二行。您的服务器接受连接,从该连接读取一行,然后等待新连接,丢弃可能在第一次连接时到达的所有内容。

然而,您的客户端使用第一个(也是唯一的)连接发送所有输入,这绝对是正确的。

这个具体问题可以这样解决:

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来处理每个客户端。