Home  >  Article  >  Java  >  In-depth understanding of the analysis of Java Socket communication

In-depth understanding of the analysis of Java Socket communication

黄舟
黄舟Original
2017-03-07 10:21:121777browse

This article mainly introduces an in-depth understanding of Java Socket. Network communication in Java is implemented through Socket. Socket is divided into two categories: ServerSocket and Socket. Those who are interested can learn more

Brief description

Sockets in Java are divided into two types: ordinary Socket and NioSocket. Here is an introduction to Socket.

We can compare Socket to a means of transportation between two cities. With it, you can shuttle back and forth between the two cities. There are many types of means of transportation, and each means of transportation also has corresponding traffic rules. The same goes for Sockets, there are many types. In most cases, TCP/IP stream sockets are used, which is a stable communication protocol. (Comparison of TCP/IP and UDP)

Network communication in Java is implemented through Socket. Socket is divided into two categories: ServerSocket and Socket. ServerSocket is used on the server side to listen to requests through the accept method. The Socket is returned after the request. The Socket is used to specifically complete data transmission. The client directly uses the Socket to initiate a request and transmit data.

The use of ServerSocket can be divided into three steps:

1. Create ServerSocket. There are a total of 5 construction methods of ServerSocket. ServerSocket (int port) is usually used, and only the port number (port) is required.

2. Call the accept method of the created ServerSocket to listen. The accept method is a blocking method, which means that after calling the accept method, the program will stop and wait for the connection request, and the program will not continue until the request is received. When receiving the request, the accept method will return a Socket.

3. Use the Socket returned by the accept method to communicate with the client.

Chestnut

Client:

package IO;

import java.io.*;
import java.net.Socket;
import java.util.Date;

/**
 * Created by zhengbin06 on 2017/2/2.
 */
public class Client {
  public static void main(String[] args) {
    String msg = "Client Data";
    try {
      Socket socket = new Socket("127.0.0.1", 9090);

      // 先写、再读
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
      // 发送数据
      printWriter.println(msg);
      printWriter.flush();
      // 获得服务端返回的数据
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      String line = bufferedReader.readLine();
      System.out.println("received from server: " + line + "\ttime=" + new Date().getTime());
      // 关闭资源
      printWriter.close();
      bufferedReader.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Server:

package IO;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**
 * Created by zhengbin06 on 2017/2/2.
 */
public class Server {
  private static Socket socket = null;
  private static ServerSocket serverSocket = null;
  public static void main(String[] args) throws IOException {
    BufferedReader bufferedReader = null;
    PrintWriter printWriter = null;
    try {
      // 创建一个ServerSocket监听9090端口
      serverSocket = new ServerSocket(9090);
      while (true) {
        System.out.println("开始等待请求。。。。");
        // 等待请求
        // 监听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
        socket = serverSocket.accept();
        System.out.println("接收到请求:" + socket.toString() + "\ttime=" + new Date().getTime());
        // 接收到请求后使用socket进行通信, 创建BufferedReader用于读取数据
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = bufferedReader.readLine();
        System.out.println("received from client: " + line + "\ttime=" + new Date().getTime());
  
        // 创建PrintWriter, 用于发送数据
        printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("received data: " + line + "\ttime=" + new Date().getTime());
        printWriter.flush();
      }
    } finally {
      // 关闭所有资源
      bufferedReader.close();
      printWriter.close();
      socket.close();
      serverSocket.close();
    }
  }
}

Details

Listening requests:

When a new Socket When a request comes, a new socket data structure will be created for this connection. The socket data information contains the address and port of the formal request source address and port. This newly created data structure will be associated with a list of outstanding connection data structures of the ServerSocket instance. Note that the corresponding Socket instance of the server has not been created at this time. The Socket instance of the server will not return until the three-way handshake with the client is completed, and the data structure corresponding to the Socket instance will not be completed. Moves in the list are done in the list.

Data transmission:

When the connection has been successfully established, both the server and the client will have a Socket instance. Each Socket instance has an InputStream and OutputStream. And exchange data through these two objects.

You must know that network I/O is transmitted as a byte stream. When creating a Socket object, the operating system will allocate a certain size buffer area for InputStream and OutputStream respectively. Data writing and reading are completed through this cache area.

The writing end writes data to the SendQ queue corresponding to the OutputStream. When the queue is full, the data will be transferred to the RecvQ queue of the InputStream on the other end. If RecvQ is full at this time, Then the write method of OutputStream will block until the RecvQ queue has enough space to accommodate the data sent by SendQ. The process is as shown in the figure below:

The above is the content of the in-depth understanding of the analysis of Java Socket communication. For more related content, please pay attention to the PHP Chinese website (www.php. cn)!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn