gpt4 book ai didi

java:读写操作上的单个套接字。全双工

转载 作者:行者123 更新时间:2023-12-03 12:00:30 27 4
gpt4 key购买 nike

我必须实现使用特定源端口发送数据并同时监听该端口。全双工。有谁知道如何在java上实现它。我试图创建单独的线程来监听套接字输入流,但它不起作用。我无法将 ServerSocket 和客户端套接字绑定(bind)到相同的源端口,并且与 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());
}
}
}

最佳答案

你想做的很奇怪:A ServerSocket是一个接受连接的完全实现的套接字,它处理自己的消息,你绝对不能在它上面捎带另一个套接字。

使用 NIO 实现全双工相当简单:

  • 创建 Channel为您的Socket在非阻塞模式下
  • 将阅读添加到兴趣 OP
  • Selector 一起 sleep 的select()方法
  • 读取任何可读字节,写入任何可写字节
  • 如果写入完成,请从兴趣 OP
  • 中删除写入
  • 转到 3。
  • 如果您需要写入,请将字节添加到缓冲区,将写入添加到感兴趣的 OP 并唤醒选择器。 (略微简化,但我相信您可以在 Javadoc 中找到自己的方法)

  • 这样,每次有空间时,您都将完全加载传出缓冲区并同时从传入缓冲区读取(嗯,单线程,但您不必完成写入即可开始读取等)。

    关于java:读写操作上的单个套接字。全双工,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512053/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com