Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-通过Socket发送连续数据_Java_Sockets - Fatal编程技术网

java-通过Socket发送连续数据

java-通过Socket发送连续数据,java,sockets,Java,Sockets,我正在编写一个Java客户机/服务器应用程序。它应该允许客户端向服务器发送文本数据。这种通信应该可以使用相同的连接重复多次 我是这样写的: // On a server: ServerSocket serverSocket = new ServerSocket(port); Socket socket = serverSocket.accept(); socket.setKeepAlive(true); BufferedReader reader = new BufferedReader(new

我正在编写一个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已关闭,则无法再次打开它。如何连续发送和读取数据?

两端需要两个线程,一个用于读取数据,另一个用于写入数据。

两端需要两个线程,一个用于读取数据,另一个用于写入数据

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

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

或者,如果客户机上的OutputStream已关闭,则无法再次打开它

当然不是。您必须创建一个新的套接字

如何连续发送和接收数据

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

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

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

或者,如果客户机上的OutputStream已关闭,则无法再次打开它

当然不是。您必须创建一个新的套接字

如何连续发送和接收数据


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

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


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

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


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

摆脱ready()测试。它只添加了一个bug,没有添加任何东西。它只添加了一个bug,这里的通信是单向的。为什么需要额外的线程?这里的通信是单向的。为什么需要额外的线程?