[英]java: Single socket on read write operation. Full duplex
我必须实现使用特定的源端口发送数据,并同时侦听该端口。 全双工。 有谁知道如何在Java上实现它。 我试图创建用于侦听套接字输入流的单独线程,但是它不起作用。 我无法将ServerSocket和客户端套接字绑定到相同的源端口,并且与netty相同。 对于沉闷的双工有什么解决方案吗?
init(){
socket = new Socket(InetAddress.getByName(Target.getHost()), Target.getPort(), InetAddress.getByName("localhost"), 250);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}
private static void writeAndFlush(OutputStream out, byte[] b) throws IOException {
out.write(b);
out.flush();
}
public class MessageReader implements Runnable {
@Override
public void run() {
//this method throw exception EOF
read(in);
}
private void read(DataInputStream in){
while (isConnectionAlive()) {
StringBuffer strBuf = new StringBuffer();
byte[] b = new byte[1000];
while ((b[0] = bufferedInputStream.read(b)) != 3) {
strBuf.append(new String(b));
}
log.debug(strBuf.toString());
}
}
}
我遇到了同样的问题,决定自己回答。 我想与大家分享代码仓库。 这确实很简单,您可以使您的东西正常工作。 这是一个详尽的例子。 这些步骤意外地看起来像Ordous的解决方案。
https://github.com/khanhhua/full-duplex-chat
随意克隆! 这是我周末的作业。
主线程:
类别:
您尝试做的事情很奇怪: ServerSocket
是一个完全实现的套接字,可以接受连接,它可以处理自己的消息,并且您绝对不能在其之上搭载其他套接字。
使用NIO,全双工非常简单:
Socket
创建一个Channel
Selector
的select()
方法进行睡眠 这样,每次有空间时,您将完全加载输出缓冲区,并同时从传入的缓冲区中读取数据(嗯,单线程,但不必完成写入就可以开始读取等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.