2014-07-01 55 views
1

我必須實現發送數據與特定的源端口,並在同一時間聽該端口。全雙工。有誰知道如何在java上實現它。我試圖創建單獨的線程來偵聽套接字輸入流,但它不起作用。我無法將ServerSocket和客戶端套接字綁定到同一個源端口,而netty也是如此。 它有沒有任何解決方案沉悶的雙工?java:讀取寫入操作時的單個套接字。全雙工

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

當您寫入特定的端口時,它不是'您的'端口..您正在寫入目標機器端口,除非您說您正在寫信給自己?從監聽器開始...... –

+0

新的Socket(remoteAddress,remotePort,localAddress,localPort)。我需要監聽本地端口並同時從該端口發送消息。 ServerSocket不能發送消息。平原插座不能聽或至少我不知道如何實現它 – Diyko

+0

你只需要一個插座讀寫。您可以調用[Socket.getInputStream](http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#getInputStream())進行讀取和[Socket.getOutputStream](http: //docs.oracle.com/javase/7/docs/api/java/net/Socket.html#getOutputStream())進行編寫。然而,從輸入流中讀取是一個阻塞調用,所以你可能希望在一個單獨的線程中完成。向我們展示一些您的代碼,以便我們可以看到您已經嘗試過的內容。 – sgbj

回答

0

主線程:

  • 創建後臺線程(S)將連接到任何目標機器(S)。
    • 這些線程將連接到目標機器和傳送數據和死
  • 創建無限循環
    • 監聽傳入的連接。
      • 線頭脫落的任何連接來處理I/O

類:

  • 服務器
    • 偵聽傳入連接和線程關閉客戶端對象
  • 客戶端
    • 該類是在接受傳入連接的服務器上創建的,TcpClient或NetClient(我忘記了什麼樣的java調用它)用於發送數據。完成後它會死亡。
  • 目標
    • 期間將啓動並連接到特定的目標和發送數據的創建。
    • 一旦完成它死亡。
+0

我不發送回覆給客戶端。我應該可以發送消息到任何服務器,並聽取prt我用於發送消息的信息 – Diyko

+0

ok,是您連接到併發送已知數據的服務器列表嗎?我認爲它必須是 –

+0

讓我們假設我們有一些稱爲Target的服務器,它具有已知的targetHost和targetPort。我使用新的套接字(remoteAddress,remotePort,myHost,myPort)連接併發送消息給Target,反之亦然目標發送到我的端口myPort,所以我必須始終收聽myPort。這不是請求 - 回覆通信。目標和我發送消息給對方以隨機順序 – Diyko

0

你試圖做的是很奇怪:一個ServerSocket是一個完全實現套接字接受連接,它可以處理自己的消息,你絕對不能背馱式上頂部的另一個插座。

全雙工是相當簡單的用NIO做:

  1. Socket在非阻塞模式
  2. 睡眠與Selectorselect()創建Channel
  3. 添加讀來了興趣有機磷農藥方法
  4. 讀取任何可讀字節,寫入任何可寫字節
  5. 如果寫入完成,請從感興趣的OP中刪除
  6. GOTO 3.
  7. 如果需要寫入,請將字節添加到緩衝區,添加寫入感興趣的OP和喚醒選擇器。 (稍作簡化,但我敢肯定,你可以找到周圍的Javadoc自己的方式)

這樣,您將每一個有空間和在同一時間進入一個讀數(時間完全加載傳出緩衝區好吧,單線程,但你不必完成寫作開始閱讀等)。

1

我遇到了同樣的問題,並決定自己回答。我想與大家分享代碼回購。這很簡單,你可以讓你的想法讓你的東西工作。這是一個詳盡的例子。這些步驟意外地看起來像Ordous的解決方案。

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

隨意克隆!這是我的週末作業。