2012-06-21 32 views
1

我试图扩大Socket对象的东西作为...的ServerSocket - 如何保持客户端套接字ID

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

,我可以看到它,在服务器端根据docs

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

ServerSocket的标准代码... accept()方法重新inits插座对象和重新变成一个新的,所以ID值不是客户的一个,而是一个再生的:(

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

回答

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

+0

没关系我也扩展了ServerSocket,所以没有ClassCastException。 – user592704

+0

...但accept()方法是一个真正的蹩脚。通过连接发送ID?你是什​​么意思? – user592704

+0

@ user592704:我根据你的评论调整了我的帖子。 – Matt

0

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

+1

无论你想要什么,你都可以实现它。为什么你想给客户端连接一个唯一的ID? –

+0

您能否给出一个很好的片段示例“Map”使用方式? – user592704

0

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

相关问题