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

时间:2012-06-21 19:23:04

标签: java sockets inheritance

我试图将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;}

}

init as ...

TestSocket testSocket = new TestSocket(SERVER_HOSTNAME, SERVER_PORT);

正如我所看到的,服务器端的ServerSocket标准代码就像一个

TestSocket mySocket = (TestSocket) serverSocket.accept();

...根据docs accept()方法重新插入套接字对象并返回一个新的,因此id值不是客户端的,而是重新生成的:(

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

3 个答案:

答案 0 :(得分:1)

我假设行

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类继承来执行此操作,而是在更高级别上处理它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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