我试图将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类继承来执行此操作,而是在更高级别上进行处理。
关于java - ServerSocket-如何保留客户端套接字ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11145310/