我正在开发一个聊天应用程序。我有个问题。如何通过服务器检测特定客户端?
我正在使用ServerSocket
和Socket
类进行沟通。
答案 0 :(得分:0)
使用getInetAddress()
Socket
来获取客户地址。
Socket clientSocket = server.accept();
InetAddress clientAddress = clientSocket.getInetAddress();
如果您的客户端对于给定的IP地址是唯一的,您可以clientAddress.getHostAddress()
获取客户端的IP地址。
答案 1 :(得分:0)
客户端连接到服务器时的标准方法是发送用户名和密码来标识客户端。如果您希望透明,可以使用System.getProperty("user.name")
,这很简单,但不是很安全。
答案 2 :(得分:0)
我稍后会给出一个粗略的要点并对其进行改进,但这里有:
因此,您将一些详细信息存储在服务器上,然后在客户端连接时,它会发送用户名和密码并对这些详细信息进行身份验证。您将端点Socket
存储在String username -> Socket socket
的地图中。同时存储反向Socket socket -> String username
。当您从套接字接收内容时,使用它来定位用户名。即使您使用套接字通道,您仍然可以使用通道方法从通道获取套接字。
我没有谈到的是你如何首先收到用户名/密码数据。为此,我建议框架。读取数据大小,然后读取数据类型,这应该是两个整数。您可以直接将对象写入套接字流,并在另一端以相同的顺序处理它们。
您应该使用带选择键的选择器,并将接收到的数据存储在附加到这些选择键的缓冲区中。然后,在尝试处理缓冲区时,如果套接字是可读的,您只需继续选择并将接收的数据添加到缓冲区。如果缓冲区在读取后写入有用的数据(即,您收到了数据的大小以及完整的数据长度),则需要删除数据并压缩缓冲区 - 即移动缓冲区按数据长度大小(int的大小)+数据类型大小(int的大小)+数据长度进行定位,然后将整个blit下降到0并将位置设置为当前接收数据的结尾。请使用buffer.compact()
。
我真的建议像KryoNet那样努力工作。网络编程很难。但这可能是一项任务,所以......