同步通信,服务器和客户端之间基于三次握手协议进行数据传输,服务器监听一个端口,客户端通过服务器的Ip地址和监听的端口号,连接到服务器,然后向服务器发送信息,服务器接受到信息后,返回一条信息给客户端。服务器和客户端之间一来一回进行通信。每一个客户端连接到服务器上时都要开辟一个新的线程进行处理。如果使用普通的2G内存的计算机作为服务器,一般最多可以处理100个客户端。
异步通信:服务器和客户端之间收发信息不必基于一来一回的方式进行通信。服务器和客户端之间自由收发信息,客户端可以同时向服务器发送多条信息,客户端也可以连续接受多条
服务器传向客户端的信息。这种通信方式是单线程的,通信效率是整体最优,一台普通计算机作为服务器,一般最多可以处理1000个客户端,但是他只能保证整体通信效率最优,对于局部情况是不可控制的,你无法控制服务器的守护线程如果去处理哪个客户端。当有多个客户端连接到同一个服务器时并在和服务器不停的进行数据传输,某个客户端向服务器发送一条信息要求立即得到回复,这用异步通信是做不到的,目前java用于有Mina和netty这2种框架可以比较好的支持异步通信。
长连接:当客户端连接上服务器时,这个连接是不断的,这种方式比较适合客户端和服务器之间的通信比较频繁时,每次进行通信就不要在连接上面浪费开销了。比较常规的方式是:当客户端连接到服务器时,可以用哈希Map进行保存客户端和服务器之间的SOCKET,一般以客户端的Ip地址和端口号作为建,含有socket的session作为值,这样做是便于查找制定的socket,当客户端和服务器之间的连接关闭时,记得从哈希map中去除session以避免内存溢出。
短连接:当客户端连接上服务器,并且发送完信息,接收到服务器返回的信息后,连接关闭。这种方式比较适合当客户端和服务器之间的通信不太频繁时。不必要维持不必要的连接。一般的处理方式是,当客户端和服务器之间完成一次通话后就立即关闭连接释放资源。
数据的传输方式:当客户端向服务器发送信息时,比如发送一串字符串,先将字符串编码为字节码进行传输,服务器接收到信息后,解码为字符串。特别注意的是,一定要注意客户端和服务器的编码和解码方式是否一致。当服务器和客户端之间传的是对象时,客户端可以根据对象的属性进行编码,服务器接收到信息后进行解码,编码和解码方式一定要相对应,不然服务器接收到信息后却打印不出来。可能解码的时候是多个线程对同一条信息进行解码,当信息比较长的时候,这时候要防止信息丢失的情况。