2017-10-07 72 views
0

我已经在我的系统中启动了一个客户端。据端口上运行没有7913.我通过TCP/IP发送请求数据从Java到服务器套接字上7913.如何使用源端口通过Java中的TCP/IP发送和接收数据

日志运行是消息发送到插座[ADDR =/190.161.153.109,端口= 7913 ,localport = 54717]

我也收到了服务器对特定数据的响应。现在服务器也试图发送一个请求到我的本地端口54717,而不是我的应用程序正在侦听的端口[即7913]。

如何处理请求?当我尝试使用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一样):

  • 附加到您在bind请求或在构造函数中指定的端口
  • 向JVM接受该端口上的新连接
  • 当连接被监听套接字改变它的状态,并为你提供新的套接字来与accept方法建立新的连接。

当您的应用程序建立NEW连接时,它使用connect方法。除非你对插座使用bind要求它(在你的例子54717)

  • 分配新的动态端口
  • 发送连接请求到服务器
  • 后建立连接,你可以用它来发送/接收请求/从服务器

因为没有人监听这个动态端口telnet请求被拒绝。

+0

我的场景是服务器不会将请求发送到套接字服务器端口。而是尝试将请求发送到上次服务的端口。在这种情况下,它的54717。但一旦收到响应,该端口54717关闭。我如何让它在我的编码中被接受。请亲引导我。 –

+0

如果您正在编写客户端应用程序,则根本不需要侦听套接字。只需使用您建立的连接(从端口54717)到所有请求/响应的服务器。如果它关闭,它会被你的应用程序关闭,或者因为应用程序退出。 –

+0

客户端应用程序从服务器收到我发送的请求的响应。但是现在服务器也试图向我的本地端口54717发送一个新的请求,而不是在我的应用正在监听的端口[即7913]。我不关闭我的线程和套接字。但是这个请求并不涉及我的应用程序本身。如何保持连接[localport 54717]活着以获得新的请求?请提供任何示例代码! –

相关问题