Java ServerSocket-如何保留客户端套接字id

Java ServerSocket-如何保留客户端套接字id,java,sockets,inheritance,Java,Sockets,Inheritance,我尝试将套接字对象扩展为 public class TestSocket extends Socket { private String id=String.valueOf(Math.random()); ... public void setId(String id){this.id=id;} public String getId(){return this.id;} } 初始化为 TestSocket testSocket = new TestSocket(SERV

我尝试将套接字对象扩展为

public class TestSocket extends Socket
{
  private String id=String.valueOf(Math.random());

  ...

  public void setId(String id){this.id=id;}
  public String getId(){return this.id;}

}
初始化为

TestSocket testSocket = new TestSocket(SERVER_HOSTNAME, SERVER_PORT);
在我看来,服务器端ServerSocket的标准代码类似于

TestSocket mySocket = (TestSocket) serverSocket.accept();
。。。根据accept()方法,重新初始化套接字对象并返回一个新的套接字对象,因此id值不是客户端的id值,而是重新生成的id值:(


是否可以保留客户端id?如果可以,那么如何保留?

您可以做的一件事是将套接字保留在数据结构中,即映射中。

您可以做的一件事是将套接字保留在数据结构中,即映射中。

我猜是这样的

TestSocket mySocket = (TestSocket) serverSocket.accept();
将引发
ClassCastException
,因为
java.io.ServerSocket.accept()
返回类
Socket
的实例,而不是
TestSocket
(除非从ServerSocket继承)

如果要连接两个套接字,可能必须通过连接发送ID并在接收端设置,如:

public void sendID() {
   DataOutputStreak dos = new DataOutputStream(getOuputStream());
   dos.writeUTF(this.getId());
}

public void receiveID() {
   DataInputStream dis = new DataInputStream(getInputStream());
   setId(dis.readUTF());
}
两个测试套接字中的一个调用一个方法,另一个调用另一个方法。 但是,我不会从套接字类继承来执行此操作,而是在更高的级别上处理此操作。

我假定

TestSocket mySocket = (TestSocket) serverSocket.accept();
将引发
ClassCastException
,因为
java.io.ServerSocket.accept()
返回类
Socket
的实例,而不是
TestSocket
(除非从ServerSocket继承)

如果要连接两个套接字,可能必须通过连接发送ID并在接收端设置,如:

public void sendID() {
   DataOutputStreak dos = new DataOutputStream(getOuputStream());
   dos.writeUTF(this.getId());
}

public void receiveID() {
   DataInputStream dis = new DataInputStream(getInputStream());
   setId(dis.readUTF());
}
两个测试套接字中的一个调用一个方法,另一个调用另一个方法。
但是,我不会从套接字类继承来执行此操作,而是在更高的级别上处理此操作。

接受的套接字的
getRemoteSocketAddress()
返回的值是唯一的(因为客户端在同一IP地址内具有不同的IP地址或不同的端口)。这就是您所需要的。

接受的套接字的
getRemoteSocketAddress()
返回的值是唯一的(因为客户端在同一IP地址中具有不同的IP地址或不同的端口)。这就是您所需要的。

您可以按照自己的意愿实现它。为什么要给客户端连接一个唯一的id?您可以给出一个好的代码段示例“映射”的使用方式吗?您可以按照自己的意愿实现它。为什么要给客户端连接一个唯一的id?您可以给出一个好的代码段示例“映射”吗使用方式?没关系,我也扩展了ServerSocket,所以不需要ClassCastException…但是accept()方法真的很糟糕。通过连接发送ID?你的意思是什么?@user592704:我刚刚根据你的评论编辑了我的帖子。我想这是一种有趣的方式:)但是有可能避免post标识吗?我也扩展了ServerSocket,所以不需要ClassCastException。。。。但是accept()方法真的很糟糕。通过连接发送ID?你的意思是什么?@user592704:我刚刚根据你的评论编辑了我的帖子。我想这是一种有趣的方式:)但是有可能避免帖子识别吗?