繁体   English   中英

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

[英]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

随意克隆! 这是我周末的作业。

主线程:

  • 创建将连接到任何目标计算机的后台线程。
    • 这些线程将连接到目标计算机并传输数据并消亡
  • 创建无限循环
    • 监听传入的连接。
      • 断开所有连接以处理I / O

类别:

  • 服务器
    • 侦听传入的连接并从Client对象断开线程
  • 客户
    • 此类是在服务器接受传入连接时创建的,TcpClient或NetClient(我忘记了Java调用它)用于发送数据。 完成后它将死亡。
  • 目标
    • 在启动期间创建,并连接到特定目标并发送数据。
    • 一旦完成,它就会死亡。

您尝试做的事情很奇怪: ServerSocket是一个完全实现的套接字,可以接受连接,它可以处理自己的消息,并且您绝对不能在其之上搭载其他套接字。

使用NIO,全双工非常简单:

  1. 在非阻塞模式下为您的Socket创建一个Channel
  2. 向感兴趣的操作员添加阅读
  3. 使用Selectorselect()方法进行睡眠
  4. 读取任何可读字节,写入任何可写字节
  5. 如果完成写入,请从感兴趣的操作中删除写入
  6. 转到3。
  7. 如果需要写入,请将字节添加到缓冲区,将写入添加到感兴趣的OP并唤醒选择器。 (略有简化,但是我相信您可以找到使用Javadoc的方法)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM