小白求教,关于JAVA socket客户端 和服务端的通信
1、客户端连接一般是与用户绑定的,无用户数据的socket就算能区分连接也毫无意义。一般做法是客户端利用HTTP登录,登录服务器分析各个socket服务器的负载后发送给客户端应该连接哪个socket服务器,客户端拿到登录成功后的用户ID后再连接socket服务器,此用户ID就可以用于socket服务器区分客户端连接。
2、如果自建socket服务器,建议最好不用SSH、SSM之类的框架,可控性更高,更加轻量,但工作量稍显繁多,且复杂;建议使用Netty做scoket基础框架。
3、客户端服务端通信可以用json格式的文本行(字符流,以\r\n自动做粘包断包解码),还有自定义数据格式的字节流(比如 数据包内容长度+数据包内容,以数据包内容长度手动编写代码做粘包断包解码),还可以用时下流行的protobuf。
serverSocket = new ServerSocket ( 9999 );
serverThread = new ServerThread ( serverSocket );
serverThreadstart ( );
看你这块的代码,你的server定义了serverSocket,当你开启服务后,新建了一个服务线程,去监听
while( flag ){try{
Socket socket = serverSocketaccept( );
ServerThreadAgent serverThreadAgent = new ServerThreadAgent( socket );
serverThreadAgentstart( );
}
catch( Exception e ){
eprintStackTrace( );
}
在监听的线程中,当遇到客户端的请求时,创建一个Socket,与客户端建立一条通道,进行通信
public void run ( ){
try
{
Object message = SocketUtilreadStream ( socket );// 接收信息
Systemoutprintln ( socketgetInetAddress ( ) + "发来信息:"
+ message);
String sendMessage = "信息已经收到。";
SocketUtilwriteStream ( sendMessage, socket );// 发送信息
}
catch ( Exception e )
{
eprintStackTrace ( );
}
}
看你的与客户端保持连接的服务代理,服务代理线程开启后,先是接受客户端的信息,先是出来,然后向客户端发送一条消息,然后,然后呢???????
然后,就没有然后来了,服务代理线程的生命就此结束,也就是说客户端与服务端的通话结束,连接已经断开。
与客户端既然已经断了,怎么可能进行消息传递呢???
这样一分析,问题明显出来了,问题出在哪?
问题就是在于与客户端保持通话的服务代理线程,怎样才能保持通话呢?
那就是在代理线程的run方法中进行循环进行监听,也就是说消息的接受,这样,才能保持通话,想结束的时候,就退出循环,或是客户端主动的结束通话。
服务器告知双方对方的ip地址,并协调由哪一方主动连接。
如 协调结果是: 把c2的地址告诉c1,让c1主动连接c2,让c2打开端口等待连接。
要考虑认证问题,比如c2如何知道连接上来的是c1,而不是其他人,就需要有认证机制。
另外要考虑内网问题。由于从外部连接内网里面的IP地址是相当繁琐复杂的,所以需要特别的机制处理。
你可以在每个用户连上服务器端时,都发送一个消息,就是用4个字节表示是用户的ID,并将与用户通信的socket,用一个HashMap存储起来,而不是用LinkList。
后面如果A发送消息给C,就把A的前四个字节(即ID)取出来,在HashMap中找到与C通信的socket,然后把消息通过socket发送出去····
这部分代码应该很容易实现的,Socket通信这东西,理清了思路就很好弄了~~
0条评论