如何使用源端口通过Java中的TCP/IP发送和接收数据
我已经在我的系统中启动了一个客户端。据端口上运行没有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;
为了理解正在发生的事情,你应该明白什么是听插座,它连接插座的区别。
当你的应用程序监听到它(ServerSocket
一样):
- 附加到您在
bind
请求或在构造函数中指定的端口 - 向JVM接受该端口上的新连接
- 当连接被监听套接字改变它的状态,并为你提供新的套接字来与
accept
方法建立新的连接。
当您的应用程序建立NEW连接时,它使用connect
方法。除非你对插座使用bind
要求它(在你的例子54717)
- 分配新的动态端口
- 发送连接请求到服务器
- 后建立连接,你可以用它来发送/接收请求/从服务器
因为没有人监听这个动态端口telnet请求被拒绝。
我的场景是服务器不会将请求发送到套接字服务器端口。而是尝试将请求发送到上次服务的端口。在这种情况下,它的54717。但一旦收到响应,该端口54717关闭。我如何让它在我的编码中被接受。请亲引导我。 –
如果您正在编写客户端应用程序,则根本不需要侦听套接字。只需使用您建立的连接(从端口54717)到所有请求/响应的服务器。如果它关闭,它会被你的应用程序关闭,或者因为应用程序退出。 –
客户端应用程序从服务器收到我发送的请求的响应。但是现在服务器也试图向我的本地端口54717发送一个新的请求,而不是在我的应用正在监听的端口[即7913]。我不关闭我的线程和套接字。但是这个请求并不涉及我的应用程序本身。如何保持连接[localport 54717]活着以获得新的请求?请提供任何示例代码! –
您对TCP/IP的工作原理有一些误解。 – Henry
你将不得不先听那个额外的端口。 – Antoniossss
我的场景是服务器不会将请求发送到套接字服务器端口。而是尝试将请求发送到上次服务的端口。在这种情况下它的54717.但是一旦收到响应,这个端口54717关闭。我如何让它在我的编码中被接受。请亲引导我。 –