繁体   English   中英

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

[英]ServerSocket - how to keep client socket id

我试图将Socket对象扩展为...

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();

...根据docs accept()方法重新初始化套接字对象并返回一个新对象,因此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());
}

您的两个测试套接字之一将调用一个方法,另一个调用另一个方法。 但是,我不会从Socket类继承来执行此操作,而是在更高级别上进行处理。

您可以做的一件事是将套接字保持在数据结构中,即。 一张地图。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM