流式通信协议TCP是一种可靠的、基于连接的协议,发送方和接收方之间必须建立连接,以便在TCP协议的的基础上进行通信。当一个socket对象(服务器)等待建立连接时,另一个socket可以要求进行连接。一旦两个socket连接起来,就可以进行双向通信。
一个完整的socket通信程序通常包括以下几个基本步骤:
1)、创建socket。首先创建ServerSocket,在客户端创建socket后,连接服务器,在服务器端创建一个和他对应的socket。
2)、打开连接到socket的输入/输出流。在客户端和服务器端分别用socket创建输入/输出流,并把客户端和服务器端的输入输出流连接起来。
3)、使用InputStream和OutputStream对socket进行读写。
4)、使用close()方法关闭socket连接。
下面通过例子说明socket的基本用法。
服务器端程序:
public class Server { public static void main(String[] args) throws IOException { System.out.println("服务器"); //指定端口号。会抛出IOException。 ServerSocket ss=new ServerSocket(5600); //循环等待接收连接 while (true) { //等待客户端的连接,如果连接成功则会返回Socket对象 Socket socket=ss.accept(); //建立输出流 OutputStream os= socket.getOutputStream(); DataOutputStream dos=new DataOutputStream(os); dos.writeUTF("我是服务器!"); //关闭输出流和socket连接 dos.close(); socket.close(); } }}
客户端程序:
public class Client { public static void main(String[] args) throws Exception { System.out.println("客户端"); //创建客户端Socket,连接服务器。 Socket socket=new Socket("localhost",5600); //用socket对象获得输入流 InputStream is=socket.getInputStream(); DataInputStream dis=new DataInputStream(is); System.out.println(dis.readUTF()); //关闭文件流和socket连接 dis.close(); socket.close(); }}
上述程序只能相应一个客户端的连接请求。在实际应用中,服务器一般需要同时响应多个客户端的请求。因此,ServerSocket对象的accept()方法每当有一个连接请求发生时,就会产生一个Socket对象,所以只要用此方法反复监听客户端请求,就可以为每个客户端生成一个专用的Socket对象进行通信。要管理这么多的Socket对象,最好的方法是将Socket对象放置在线程中。这样当每个Socket对象执行完毕后,只有包含该Socket对象的线程会终止,其他线程没有任何影响。
多线程的讲解请看: