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)!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Chinese version
Chinese version, very easy to use

SublimeText3 English version
Recommended: Win version, supports code prompts!

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Dreamweaver CS6
Visual web development tools

WebStorm Mac version
Useful JavaScript development tools