如何使用源端口通过Java中的TCP / IP发送和接收数据

时间:2017-10-07 08:04:27

标签: java sockets serversocket tcp-ip asyncsocket

我已在我的系统中启动了一个客户端。它在端口号7913上运行。我通过TCP / IP从Java发送请求数据到7913上运行的服务器套接字。

  

log is Message发送到Socket [addr = / 190.161.153.109,port = 7913,localport = 54717]

我还收到了服务器对该特定数据的响应。现在服务器也在尝试向我的localport 54717发送请求,而不是我的应用程序正在监听的端口[即7913]。

如何处理请求?当我尝试使用telnet连接到我的localport时,连接被拒绝。

代码:

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;     

1 个答案:

答案 0 :(得分:0)

要了解发生了什么,您应该了解什么是倾听套接字以及它与连接套接字的区别。

当你的应用程序监听它时(ServerSocket会这样做):

  • 附加到您在bind请求或构造函数
  • 中指定的端口
  • 要求JVM在该端口上接收新连接
  • 当收到连接时,侦听套接字会更改状态,并为使用accept方法的新连接提供新的套接字。

当您的应用程序建立新连接时,使用connect方法。除非你在socket上使用bind请求:

  • 分配新的动态端口(在您的示例中为54717)
  • 向服务器发送连接请求
  • 建立连接后,您可以使用它来发送/接收来自/来自服务器的请求

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