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


多线程的讲解请看:java ——多线程