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

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

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

最佳答案

你永远不会读第二行。您的服务器接受连接,从该连接读取一行,然后等待新连接,丢弃可能到达第一个连接的所有内容。

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

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

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());
  }
}

这将导致您的程序打印到达第一个连接的所有内容,但它永远不会接受第二个连接。

为了处理多个客户端,您需要一个线程来处理每个客户端。

关于java - 无法通过套接字发送多条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36135983/

相关文章:

java - 针对某些操作创建用户事件。推荐的解决方案是什么?

c++ - 如何向 socks5 代理服务器添加身份验证?

java RMI + 源命中服务器来自互联网或来自内网

delphi - TCP 客户端未接收到来自 RTSP 服务器的响应

c - 使用套接字读取 char* 时出现段错误

java - 标准、独立子查询、分组依据和拥有更多

java - Spring 是如何解析 View 的?

java - 您如何维护 wicket 中面板的样式信息?

sockets - 有没有办法在魔兽世界 Lua 脚本中使用套接字?

Java分布式系统