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 如何正确发送和接收多个流_Java_Sockets_Nio - Fatal编程技术网

Java 如何正确发送和接收多个流

Java 如何正确发送和接收多个流,java,sockets,nio,Java,Sockets,Nio,我正在尝试制作与teamviewer类似的东西,我的服务器向客户端发送命令,客户端开始发送屏幕截图,我一直在JLabel中显示这些截图,现在如果我的服务器发送另一个命令,如“stream audio”,我如何使我的客户端流音频也与桌面流一起(服务器应该能够理解接收到哪些数据)?我应该使用NIO吗?我不知道NIO如何帮助写入多个输出和读取多个输出 编辑- 例如,我的服务器发送一个命令,客户端在一个新线程中对屏幕进行流式处理,我的服务器再次发送一个命令以获取音频,我的客户端启动另一个线程以获取音频,

我正在尝试制作与teamviewer类似的东西,我的服务器向客户端发送命令,客户端开始发送屏幕截图,我一直在JLabel中显示这些截图,现在如果我的服务器发送另一个命令,如“stream audio”,我如何使我的客户端流音频也与桌面流一起(服务器应该能够理解接收到哪些数据)?我应该使用NIO吗?我不知道NIO如何帮助写入多个输出和读取多个输出

编辑-
例如,我的服务器发送一个命令,客户端在一个新线程中对屏幕进行流式处理,我的服务器再次发送一个命令以获取音频,我的客户端启动另一个线程以获取音频,此时有两个字节进入服务器,我的服务器如何正确处理它们?

您需要先发送流标识符和长度每个流.NIO都会成为主要的障碍。
DataInput/OutputStreams
是一条可行之路

一个short或int表示类型,一个int(可能)表示长度

dos.writeShort(type);
dos.writeInt(length);
dos.write(data);
而且

int type = dis.readShort();
int length = dis.readInt();
byte[] buffer = new byte[length];
dis.readFully(buffer);
当您有命令要发送时,您应该发送一个命令,但是要读取客户端发送的所有内容,您需要另一个线程,该线程在断开连接之前一直处于read()循环中

如果在读取或写入时引发IOException,那么断开客户端连接是正确的吗?或者可能是因为延迟等其他原因吗


您应该关闭除“SocketTimeoutException”之外的任何
IOException上的套接字。

NIO通常会造成阻碍。您需要在每个流之前发送一个流标识符和长度。DataInput/OutputStreams是方法。@EJP我使用DataInputStream和DataOutputStream,并将它们转换为字节[]然后发送它们并在那里重新创建图像,我的客户机/服务器体系结构是,我的服务器仅在向客户机发送响应时才接受回复,我应该使用什么数据类型标识符?如果我将图像与图像字节一起发送,它会损坏图像吗?如我所说,首先发送图像,并附上长度。在图像字节之前。短或者一个int表示类型,一个int(可能)对于长度。@EJP,但是我的服务器只有在服务器发送命令后才读取响应,我这样做是因为如果客户端断开连接,我会得到IOException,我可以断开连接,但是如果我这样做,意味着我需要让我的服务器不断地读取响应和写入响应,这是否意味着我必须使用sep运行线程,等待客户端回复并在其中排序?或者有更好的方法吗?我不明白所有这些,但在阻止I/O时,每个客户端总是需要一个单独的线程。谢谢@EJP,使用简短,哦,我明白了,除了SocketTimeout,好的,现在明白了