1

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

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

是否可以保留客户ID?如果是,那怎么办?

4

3 回答 3

1

我假设这条线

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

会引发 aClassCastException因为java.io.ServerSocket.accept()返回 class 的实例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 类继承来执行此操作,而是在更高级别上处理此操作。

于 2012-06-21T19:52:22.567 回答
0

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

于 2012-06-21T19:34:16.370 回答
0

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

于 2012-06-22T00:07:26.443 回答