Dieser Artikel führt hauptsächlich in ein detailliertes Verständnis der Java-Socket-Netzwerkkommunikation ein, die in zwei Kategorien unterteilt ist: ServerSocket und Socket 🎜> Kurzbeschreibung
Socket ist in Java in zwei Typen unterteilt: gewöhnlicher Socket und NioSocket. Hier finden Sie eine Einführung in Socket.
Wir können Socket mit einem Transportmittel zwischen zwei Städten vergleichen. Es gibt viele Arten von Transportmitteln, und jedes Transportmittel hat auch entsprechende Verkehrsregeln. Das Gleiche gilt für Sockets, es gibt viele Arten. In den meisten Fällen werden TCP/IP-Stream-Sockets verwendet, bei denen es sich um ein stabiles Kommunikationsprotokoll handelt. (Vergleich von TCP/IP und UDP) Die Netzwerkkommunikation in Java ist in zwei Kategorien unterteilt: ServerSocket und Socket. ServerSocket wird auf der Serverseite verwendet, um Anfragen über die Accept-Methode abzuhören Der Socket wird nach der Anfrage zurückgegeben. Der Socket wird verwendet, um die Datenübertragung direkt abzuschließen.Die Verwendung von ServerSocket kann in drei Schritte unterteilt werden:
1. ServerSocket erstellen. Es gibt insgesamt 5 Konstruktionsmethoden für ServerSocket. Normalerweise wird ServerSocket (int port) verwendet, und es ist nur die Portnummer (port) erforderlich.
2. Rufen Sie die Accept-Methode des erstellten ServerSocket auf, um zuzuhören. Die Akzeptanzmethode ist eine Blockierungsmethode. Dies bedeutet, dass das Programm nach dem Aufruf der Akzeptanzmethode anhält und auf die Verbindungsanforderung wartet und erst dann fortfährt, wenn die Anforderung empfangen wird. Beim Empfang der Anfrage gibt die Accept-Methode einen Socket zurück.
3. Verwenden Sie den von der Accept-Methode zurückgegebenen Socket, um mit dem Client zu kommunizieren.
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(); } } }
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
Anhörungsanfrage:
Wann Wenn eine neue Socket-Anfrage eingeht, wird für diese Verbindung eine neue Socket-Datenstruktur erstellt. Die Informationen zu den Socket-Daten enthalten die Adresse und den Port der formalen Quelladresse und des Ports der Anfrage. Diese neu erstellte Datenstruktur wird einer Liste ausstehender Verbindungsdatenstrukturen in der ServerSocket-Instanz zugeordnet. Beachten Sie, dass die entsprechende Socket-Instanz des Servers zu diesem Zeitpunkt noch nicht erstellt wurde. Die Socket-Instanz des Servers wird erst nach Abschluss des Drei-Wege-Handshakes mit dem Client erstellt, und die der Socket-Instanz entsprechende Datenstruktur wird nicht zurückgegeben Die Bewegungen in der Liste werden in der Liste ausgeführt.
Datenübertragung:
Wenn die Verbindung erfolgreich hergestellt wurde, verfügen sowohl der Server als auch der Client über eine Socket-Instanz, und jede Socket-Instanz verfügt über einen InputStream und einen OutputStream . Und Daten über diese beiden Objekte austauschen.
Sie müssen wissen, dass Netzwerk-E/A in Byte-Streams übertragen werden. Beim Erstellen eines Socket-Objekts weist das Betriebssystem einen Pufferbereich einer bestimmten Größe für das Schreiben und Lesen von Daten zu über diesen Cache-Bereich abgeschlossen.
Das schreibende Ende schreibt die Daten in die SendQ-Warteschlange, die dem OutputStream entspricht. Wenn die Warteschlange voll ist, werden die Daten in die RecvQ-Warteschlange des InputStream am anderen Ende übertragen zu diesem Zeitpunkt voll ist, wird die Schreibmethode von OutputStream blockiert, bis die RecvQ-Warteschlange über genügend Platz verfügt, um die von SendQ gesendeten Daten aufzunehmen. Der Prozess ist in der folgenden Abbildung dargestellt:
Das Obige ist das detaillierte Verständnis der Analyse der Java-Socket-Kommunikation. Für weitere verwandte Inhalte zahlen Sie bitte Achtung auf die chinesische PHP-Website (www.php.cn)!