java socket 技术分为服务端socket:ServerSocket 和客户端socket:Socket
ServerSocket与Socket 的建立通信方式:
服务端:
1、ServerSocket 监听端口、调用accept()创建一个Socket,并等待客户端的连接
2、获取socket的InputStream ,并从中读取客户端发送过来的数据
客户端:
1、创建一个指定IP,端口的socket,获取socket的OutputStream输出流
2、向输出流写数据,然后flush() 发送数据
由于socket是双向通信的,所有ServerSocket 可以读取客户端的数据,也可以获取OutputStream 后写数据给客户端;客户端也可以获取InputStream 读取服务端发送过来的数据。
需要注意的地方:1、accept() 是阻塞的,InputStream 是阻塞的。2、写数据后需要flush();
现在引入一个更实际的一个问题:服务端、客户端如何根据接受到的数据进行相应的处理?
思路是:服务端、客户端接受到数据后进行判断,为特定的字符是调用相应的方法,这样可以处理很多逻辑业务。
另外通过传数据给服务端或客户端特定的字符告诉可以结束读取数据的等待而结束socket。
还有一个实际问题,如何处理多个客户端与一个服务端的关系?
在这里一个服务端是指一个ip和端口,在服务端为了处理能同时处理多个客户端的通信实际上创建了多个socket 来对应处理。
为了能异步处理客户端的请求,在服务端创建了socket后放入线程中运行,这样就实现了异步处理了,处理方法在线程的run方法中被调用。
socket 设置超时,超时用于中断读取数据阻塞。
client.setSoTimeout(10*1000);
socket编码问题:
客户端的输入流编码与服务端的输出流编码一致
客户端的输出流编码与服务端的输入流编码一致
附一个具体的网址:http://haohaoxuexi.iteye.com/blog/1979837#comments