我必须实现使用特定源端口发送数据,同时监听该端口。全双工。有人知道如何在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());
}
}
}
答案 0 :(得分:1)
我遇到了同样的问题并决定自己回答。我想和你们分享代码回购。这很简单,你可以让你的东西工作。这是一个精心制作的例子。这些步骤不小心看起来像Ordous的解决方案。
https://github.com/khanhhua/full-duplex-chat
随意克隆!这是我周末的家庭作业。
答案 1 :(得分:0)
主线程:
类:
答案 2 :(得分:0)
你要做的事情很奇怪:ServerSocket
是一个完全实现的套接字,它接受连接,它处理自己的消息,你肯定不能在它上面捎带另一个套接字。
全双工对NIO来说相当简单:
Channel
创建Socket
Selector
select()
方法这样,每当有空间并同时从传入缓冲区读取时,您将完全加载传出缓冲区(好吧,单线程,但您不必完成写入以开始阅读等)