流式通信协议TCP是一种可靠的、基于连接的协议,发送方和接收方之间必须建立连接,以便在TCP协议的的基础上进行通信。当一个socket对象(服务器)等待建立连接时,另一个socket可以要求进行连接。一旦两个socket连接起来,就可以进行双向通信。

一个完整的socket通信程序通常包括以下几个基本步骤:

1)、创建socket。首先创建ServerSocket,在客户端创建socket后,连接服务器,在服务器端创建一个和他对应的socket

2)、打开连接到socket的输入/输出流。在客户端和服务器端分别用socket创建输入/输出流,并把客户端和服务器端的输入输出流连接起来。

3)、使用InputStreamOutputStreamsocket进行读写。

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对象的线程会终止,其他线程没有任何影响。

多线程的讲解请看: