小白求教,关于JAVA socket客户端 和服务端的通信

小白求教,关于JAVA socket客户端 和服务端的通信,第1张

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通信这东西,理清了思路就很好弄了~~

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 小白求教,关于JAVA socket客户端 和服务端的通信

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情