什么是Socket

Java中的Socket编程其实就是网络编程,一般使用基于TCP/IP协议的Socket编程。所有关于Socket编程的API都在Java.net包里,一般实现客户端和服务器端之间的通讯。

Socket通讯的过程

Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  1. 创建Socket;
  2. 打开连接到Socket的输入/出流;
  3. 按照一定的协议对Socket进行读/写操作;
  4. 关闭Socket。

socket编程要求

  1. 服务器的位置必须得是固定的,
1
ServerSocket server=new ServerSocket(6789);

注:端口号的分配必须是唯一的,因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0到65535之间的,前1024个端口已经被TCP/IP作为保留端口,因此你所分配的端口只能是1024个之后的。

1
Socket socket = server.accept();

 

注:accept方法是一个阻塞方法,在服务器端与客户端之间建立联系之前会一直等待阻塞。

在客户端中,用如下代码打开一个socket:

1
Socket client = new Socket("127.0.0.1", 8919); //两个参数(host,port)

 

注:host即客户端需要连接的机器,port就是服务器端用来监听请求的端口。

例子:

我们从客户端的Socket对象中得到OutputStream对象,然后写入数据后。很类似文件IO的处理代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ClientSocket {
     public static void main(String args[]) {
        String host = "127.0.0.1";
         int port = "8919";
         try{
               Socket client = new Socket(host ,port );
               Writer writer = new OutputStreamWriter(client.getOutputStream());
               writer.writer("Hello From Client");
               writer.flush();
               writer.close();
               client.close();
             } catch (IOException e) {
                    e.printStackTrace();
            }
}

 

在服务器端创建一个Socket,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ServerClient {
    public static void main(String[] args) {
       int port = 8919;
       try {
        ServerSocket server = new ServerSocket(port);
        Socket socket = server.accept();
        Reader reader = new InputStreamReader(socket.getInputStream());
        char chars[] = new char[1024];
        int len;
        StringBuilder builder = new StringBuilder();
        while ((len=reader.read(chars)) != -1) {
        builder.append(new String(chars, 0, len));
        }
        System.out.println("Receive from client message=: " + builder);
        reader.close();
        socket.close();
        server.close();
        } catch (Exception e) {
        e.printStackTrace();
   }
  }
}

 

支持多客户的client/server程序

前面的Client/Server程序只能实现Server和一个客户的对话。在实际应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。