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