2017-10-07 4 views
0

システムでクライアントを起動しました。それは何7913.私は7913.ソースポートを使用してJavaでTCP/IPでデータを送受信する方法

ログ上で動作するJavaからサーバソケットにTCP/IP経由で要求データを送信していないのですポート上で実行されているソケットに送信されたメッセージ[ADDR =/190.161.153.109、ポート= 7913 、localport = 54717]

また、特定のデータについてサーバーからの応答も受け取りました。現在、サーバーは私のアプリケーションがリッスンしているポート[すなわち7913]ではなく、私のローカルポート54717にリクエストを送信しようとしています。

リクエストの処理方法は? telnetでローカルポートに接続しようとすると、接続が拒否されます。

コード:

public static String ickTransport(String ickHeader,String ickdata, Socket connection) throws UnknownHostException, IOException 

    try 
    { 
     connection.setSoTimeout(Integer.parseInt(ickTimeOut)); 
     log.debug("ick Message for "+connection.toString()+" is " + ickMessage);    
     BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream()); 
     DataOutputStream osw = new DataOutputStream(bos); 
     osw.writeShort(Integer.parseInt(ickHeader)); 
     osw.writeBytes(ickMessage); 
     osw.flush(); 

     DataInputStream stream = new DataInputStream(connection.getInputStream()); 
     int numberRecords = stream.readShort(); 
     if (numberRecords > 0) { 
      int nSizeRead = 0; 
      byte[] bRequest = new byte[numberRecords]; 

      int nSizeBuffer; 
      for (; numberRecords > 0; numberRecords -= nSizeBuffer) { 
       byte[] bBuffer = new byte[numberRecords]; 
       nSizeBuffer = stream.read(bBuffer); 
       System.arraycopy(bBuffer, 0, bRequest, nSizeRead, nSizeBuffer); 
       nSizeRead += nSizeBuffer; 
      } 
      ickResponse = new String(bRequest); 
      log.debug("Response from ick is " + ickResponse); 
     }    
    } 
    catch (SocketTimeoutException e) 
    { 
     log.error(e.getMessage());  
    } 

    return ickResponse;  
+2

TCP/IPの動作を誤解しています。 – Henry

+0

まず、追加のポートでリスンする必要があります。 – Antoniossss

+0

私のシナリオでは、サーバーはソケットサーバーポートに要求を送信しませんでした。代わりに、最後にサービスを提供したポートに要求を送信しようとします。この場合は54717です。しかし、応答が受信されると、このポート54717は閉じます。どのように私はそれを私のコーディングで受け入れることができます。親切に私を導く。 –

答えて

0

あなたに何が起こっているか理解するには、ソケットとそれがどのように接続ソケットと異なっを聞くが何であるかを理解する必要があります。

アプリケーションがそれをリッスン(このServerSocketはありません):

  • は、あなたがた場合
  • そのポートに新しい接続を受信するJVMを掲載しbind要求またはコンストラクタで
  • を指定したポートに接続します接続が受信された状態でlistenソケットが状態を変更し、acceptメソッドで新しい接続用の新しいソケットを提供します。

アプリケーションが新しい接続を確立すると、connectメソッドが使用されます。あなたが要求を受信/送信するためにそれを使用することができ、接続確立後、サーバ

  • に接続要求を送信し
    • を割り当て、新しい動的ポート(あなたの例では54717)
    • :あなたはソケット上でそれを bind要求を使用しない限り、/from server

    このダイナミックポートを聴いている人は誰もいないので、telnetリクエストは拒否されます。

  • +0

    私のシナリオは、サーバーがソケットサーバーのポートに要求を送信していないです。代わりに、最後にサービスを提供したポートに要求を送信しようとします。この場合は54717です。しかし、応答が受信されると、このポート54717は閉じます。どのように私はそれを私のコーディングで受け入れることができます。親切に私を導く。 –

    +0

    クライアントアプリケーションを作成する場合、listenソケットはまったく必要ありません。あなたが設定した接続(ポート54717から)をすべての要求/応答のためにサーバに使用してください。閉じた場合、アプリケーションによって閉じられるか、アプリケーションが終了するため終了します。 –

    +0

    クライアントアプリケーションは、送信した要求に対してサーバーから応答を受信します。しかし今、サーバーは私のアプリケーションがリッスンしているところに移植するのではなく、私のlocalport 54717に新しい新鮮な要求を送ることを試みています[ie 7913]。私のスレッドもソケットも閉じていません。しかし、要求は私のアプリケーション自体には来ていません。新鮮なリクエストを得るためにどのように接続[localport 54717]を維持するには?任意のサンプルコードしてください! –

    関連する問題