Java套接字 - 读取和写入

6
问题: 客户端没有收到任何消息。
以下是客户端和服务器的完整代码:
客户端:
public class Client extends Socket{


public Client(String hostName, int port) throws UnknownHostException, IOException {
    super(hostName,port);

    BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));

    while(true) {
        String line = in.readLine();
        System.out.println("Text received: " + line);
    }

}

服务器

public final class Server extends ServerSocket{

public Server(int port) throws IOException {
    super(port);

    System.out.println("Server waiting for client 1");
    Socket client1 = accept();
    PrintWriter writer = new PrintWriter(client1.getOutputStream(), true);
    writer.write("Hello user 1");

    System.out.println("Server waiting for client 2");
    Socket client2 = accept();
    PrintWriter writer2 = new PrintWriter(client2.getOutputStream(), true);
    writer2.write("Hello user 2");

    System.out.println("Clients connected");

}
  • 我启动服务器监听端口4444
  • 我使用主机名“localhost”和端口4444启动客户端

为什么它应该接收任何东西? - Sotirios Delimanolis
getInputStream() 定义在哪里? - clearlyspam23
@clearlyspam23 客户端类继承 Socket。 - ShlomiRex
修改了我的答案。连接是否成功?尝试在 Socket client1 = accept(); 后添加一个 println() 语句并查看是否打印。 - Alexander Guyer
你正在读取行,但没有写入行。添加一个行终止符或使用 println()。注意:你的读取循环不够充分。它没有测试流的结束。应该是 while ((line = in.readLine()) != null) {...} - user207421
1个回答

14
您必须在消息末尾包含换行符,并且如果连接未立即更改,则还必须刷新PrintWriter,以强制自动刷新:
writer.write("Hello user 1\n");
writer.flush();

编辑:

可以通过使用构造函数new PrintWriter(someOutputStream, true)来启用PrintWriter的自动刷新功能。

然而,正如文档中所解释的那样:

如果启用了自动刷新,则只有在调用println、printf或format方法之一时才会进行刷新,而不是每次输出换行符时都进行刷新。

这意味着即使启用了自动刷新,在调用write后仍然需要手动刷新PrintWriter,并且必须在字符串末尾包含换行符(\n)。

编辑2:

下面是一个完全功能的客户端/服务器应用程序的小例子:

客户端:

public static void main(String[] args){
    try{
        Socket socket = new Socket(HOST_ADDRESS, PORT);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(bufferedReader.readLine());
        bufferedReader.close();
        socket.close();
    }catch(IOException e){}
}

服务器:

public static void main(String[] args){
    try{
        ServerSocket serverSocket = new ServerSocket(PORT);
        Socket socket = serverSocket.accept();
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.write("Hello user!\n");
        printWriter.flush();
        printWriter.close();
        socket.close();
        serverSocket.close();
    }catch(IOException e){}
}

编辑以包括一个完全功能的示例 - Alexander Guyer
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - ShlomiRex
谢谢!救了我的一天。 - bfrguci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接