【问题标题】:java - continuous data sending through Socketjava - 通过Socket连续发送数据
【发布时间】:2013-07-27 10:05:33
【问题描述】:

我正在编写一个 Java 客户端/服务器应用程序。它应该允许客户端向服务器发送文本数据。这种通信应该可以使用同一个连接重复多次。

我是这样写的:

// On a server:
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
socket.setKeepAlive(true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
if (reader.ready()) {
    for (String line = reader.readLine(); line != null; line = reader.readLine()) {
        // do something with line
    }
}

// On a client:
Socket socket = new Socket(host, port);
socket.setKeepAlive(true);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("Some data from client to server");
writer.flush();

问题是:在客户端关闭 OutputStream 之前,我无法在服务器上读取。或者,如果它已经关闭,我无法再次在客户端上打开 OutputStream。如何进行数据的连续发送和读取?

【问题讨论】:

  • 摆脱 ready() 测试。除了一个错误,它什么也没增加。

标签: java sockets


【解决方案1】:

两端需要两个线程,一个读数据,一个写数据。

【讨论】:

  • 这里的通信是单向的。为什么需要额外的线程?
【解决方案2】:

问题是:在客户端关闭 OutputStream 之前,我无法在服务器上读取数据。

是的,你可以。您只是无法解决 readLine() 返回 null 的情况。这不是一回事。

或者我无法在客户端上再次打开 OutputStream,如果它已经关闭的话。

当然不是。您必须创建一个新的 Socket。

如何连续发送和接收数据?

我不明白这个问题。您发布的代码没有尝试这样做。

【讨论】:

    【解决方案3】:

    如果您的目标是通过同一个套接字连接发送许多消息,则这些消息必须由应用程序级协议分隔。换句话说,您将无法依赖任何系统调用(如reader.ready()reader.readLine() == null)来检测服务器上消息的结尾。

    实现此目的的一种方法是在每条消息的开头使用其长度(以字符为单位)。然后,服务器将准确读取该数量的字符,然后停止并等待新消息。另一种是定义一个特殊的字符序列来结束每条消息。服务器将通过结束当前消息的读取并返回“等待新消息”状态来响应读取该特定序列。您必须确保此序列永远不会出现在消息本身中。

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 2021-03-27
      • 2022-06-14
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多