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

时间:2014-07-01 13:53:53

标签: java sockets duplex socketchannel

我必须实现使用特定源端口发送数据,同时监听该端口。全双工。有人知道如何在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());
        }
}
        }

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并决定自己回答。我想和你们分享代码回购。这很简单,你可以让你的东西工作。这是一个精心制作的例子。这些步骤不小心看起来像Ordous的解决方案。

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

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

答案 1 :(得分:0)

主线程:

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

类:

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

答案 2 :(得分:0)

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

全双工对NIO来说相当简单:

  1. 以非阻止模式为您的Channel创建Socket
  2. 添加阅读兴趣OP
  3. 使用Selector select()方法
  4. 进行睡眠
  5. 读取任何可读字节,写入任何可写字节
  6. 如果写完了,请从兴趣OP中删除写入
  7. GOTO 3。
  8. 如果需要编写,请将字节添加到缓冲区,添加写入兴趣OP和唤醒选择器。 (略微简化,但我确定你可以找到你在Javadoc周围的方式)
  9. 这样,每当有空间并同时从传入缓冲区读取时,您将完全加载传出缓冲区(好吧,单线程,但您不必完成写入以开始阅读等)