Java的:在读写操作的单插座。 全双工(java: Single socket on read

2019-10-20 09:38发布

我要实现与特定的源端口发送数据,并在同一时间收听到该端口。 全双工。 有谁知道如何实现它了Java。 我试图为监听套接字输入流创建单独的线程,但它不工作。 我不能绑定的ServerSocket和客户Socket相同的源端口,并与网状的相同。 它有没有沉闷的双工任何解决方案?

    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());
        }
}
        }

Answer 1:

我曾经遇到同样的问题,并决定回答它自己。 我想和你们的代码回购分享。 这是非常简单的,你可以得到的想法,使你的东西的工作。 这是一个复杂的例子。 步骤小心看起来像Ordous的解决方案。

https://github.com/khanhhua/full-duplex-chat

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



Answer 2:

主线程:

  • 创建后台线程(S)将连接到任何目标机器(S)。
    • 这些线程将连接到目标机器和传送数据和模
  • 创建一个无限循环
    • 侦听传入的连接。
      • 线头脱落的任何连接来处理I / O

类别:

  • 服务器
    • 侦听进入连接和螺纹关闭客户端对象
  • 客户
    • 这个类是在服务器接受传入的连接创建的的TcpClient或NetClient(我忘了Java调用它)来发送数据。 完成后死去。
  • 目标
    • 在启动期间创建并连接到特定的目标和发送数据。
    • 一旦完成它死。


Answer 3:

你正在试图做的是很奇怪:一个ServerSocket是一个完全实现套接字接受连接,它可以处理自己的消息,你绝对不能背驮式上顶部的另一个插座。

全双工是相当简单的用NIO的事情:

  1. 创建一个Channel为您Socket非阻塞模式
  2. 添加读取到的利益有机磷农药
  3. 有休眠Selectorselect()方法
  4. 读取任何可读的字节,写什么写字节
  5. 如果书写时,除去利息的OP写
  6. GOTO 3。
  7. 如果你需要写,加字节的缓冲区,加写兴趣OP和唤醒选择。 (稍作简化,但我敢肯定,你可以找到周围的Javadoc自己的方式)

这样,您就可以在每次加载完全传出缓冲区还有空间,并在同一时间从传入一个读书(当然,单个线程,但是你没有写完开始阅读等)。



文章来源: java: Single socket on read write operation. Full duplex