簡體   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