Heim Java javaLernprogramm Teilen von Beispielen für die Socket-Programmierung in Java (Bild)

Teilen von Beispielen für die Socket-Programmierung in Java (Bild)

May 28, 2017 am 09:20 AM
java socket 编程

Steckdose ist für uns sehr praktisch. Nachfolgend finden Sie die Anmerkungen zu dieser Studie. Es ist hauptsächlich in Ausnahmetypen, Interaktionsprinzipien, Socket, ServerSocket und Multithreading unterteilt.

Für Echtzeitanwendungen oder Echtzeitspiele kann das HTTP-Protokoll unsere Anforderungen oft nicht erfüllen. Derzeit ist Socket für uns sehr praktisch. Nachfolgend finden Sie die Anmerkungen zu dieser Studie. Es wird hauptsächlich anhand von Ausnahmetypen, Interaktionsprinzipien, Socket, ServerSocket und Multithreading erläutert.

Ausnahmetypen

Bevor Sie den Inhalt von Socket verstehen, müssen Sie zunächst einige der beteiligten Ausnahmetypen verstehen. Die folgenden vier Typen erben alle von IOException, sodass viele von ihnen IOException direkt aufrufen können.

UnkownHostException:  Hostname oder IP-Fehler
ConnectException:  Der Server hat die Verbindung abgelehnt, der Server wurde nicht gestartet (die Anzahl der Warteschlangen wurde überschritten, die Verbindung wurde abgelehnt)
SocketTimeoutException: Zeitüberschreitung bei der Verbindung
BindException:   Das Socket-Objekt kann nicht mit der angegebenen lokalen IP-Adresse oder Portbindung verbunden werden

Interaktionsprozess

Interaktion zwischen Socket und ServerSocket, ich denke, das folgende Bild war sehr detailliert und klar.

Socket-Konstruktor

Socket()
Socket(InetAddress address, int port)throws UnknownHostException, IOException
Socket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException
Socket(String host, int port)throws UnknownHostException, IOException
Socket(String host, int port , InetAddress localAddress, int localPort)wirft IOException

Mit Ausnahme des ersten ohne Parameter werden andere Konstruktoren versuchen, eine Verbindung mit dem Server herzustellen. Wenn dies fehlschlägt, wird ein IOException-Fehler ausgelöst. Bei Erfolg wird das Socket-Objekt zurückgegeben.

InetAddress ist eine Klasse, die zum Aufzeichnen von Hosts verwendet wird. Ihre statische getHostByName(String-Nachricht) kann eine Instanz zurückgeben. Ihre statische Methode getLocalHost() kann auch die IP-Adresse des aktuellen Hosts abrufen und eine Instanz zurückgeben. Die Parameter des Socket-Konstruktors (String host, int port, InetAddress localAddress, int localPort) sind Ziel-IP, Ziel-Port, gebundene lokale IP bzw. gebundener lokaler Port.

Socket-Methode

getInetAddress(); Die IP-Adresse des Remote-Servers
getPort(); der Remote-Server
getLocalAddress()  Die IP-Adresse des lokalen Clients
getLocalPort()  Der Port des lokalen Clients
getInputStream();  Holen Sie sich den Eingabestream
getOutStream(); Holen Sie sich den Ausgabestream

Es ist erwähnenswert, dass unter diesen Methoden die wichtigsten getInputStream() und getOutputStream() sind.

Socket-Status

isClosed(); //Ob die Verbindung geschlossen ist, sonst true zurückgeben;
isConnect(); //Wenn es schon einmal verbunden war, gib true zurück; andernfalls gib false zurück
isBound(); //Wenn der Socket an einen lokalen Port gebunden wurde, gib false zurück >

Wenn Sie bestätigen möchten, ob der Socket-Status verbunden ist, ist die folgende Aussage eine gute Möglichkeit, dies zu beurteilen.

boolean isConnection=socket.isConnected() && !socket.isClosed(); // Bestimmen Sie, ob die Verbindung derzeit verbunden ist


Half-close the Socket

Oft wissen wir nicht, wie lange es dauert, den erhaltenen Eingabestream einzulesen, bevor er endet. Im Folgenden sind einige der gebräuchlichsten Methoden aufgeführt:


  •  Benutzerdefinierter Bezeichner (wie im folgenden Beispiel: Schließen Sie den Socket, wenn Sie die Zeichenfolge „bye“ empfangen)

  •  Geben Sie die Leselänge an (bei einigen benutzerdefinierten Protokollen sind die ersten paar Bytes festgelegt, um die Leselänge anzugeben)

  •  Alle Daten lesen

  •  Wenn der Socket beim Aufrufen von close geschlossen ist, schließen Sie seine Eingabe- und Ausgabestreams


ServerSocket-Konstruktor


ServerSocket()throws IOException
ServerSocket(int port)throws IOException
ServerSocket(int port, int backlog)throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException
Nach dem Login kopieren

Hinweis:

1. Der zu überwachende Port vom Port-Server; die Warteschlangenlänge der Backlog-Client-Verbindungsanforderung; bindAddr-Server-Bindungs-IP

2. Wenn der Port belegt ist oder keine Berechtigung zur Verwendung bestimmter Ports hat, wird ein BindException-Fehler ausgelöst. Beispielsweise erfordern die Ports 1–1023, dass Administratoren über die Berechtigung zum Binden verfügen.

3. Wenn der Port auf 0 gesetzt ist, weist das System ihm automatisch einen Port zu;

4. bindAddr用于绑定服务器IP,为什么会有这样的设置呢,譬如有些机器有多个网卡。

5. ServerSocket一旦绑定了监听端口,就无法更改。ServerSocket()可以实现在绑定端口前设置其他的参数。

单线程的ServerSocket例子


public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();//从连接队列中取出一个连接,如果没有则等待
      System.out.println("新增连接:"+socket.getInetAddress()+":"+socket.getPort());
      ...//接收和发送数据
    }catch(IOException e){e.printStackTrace();}finally{
      try{
        if(socket!=null) socket.close();//与一个客户端通信结束后,要关闭Socket
      }catch(IOException e){e.printStackTrace();}
    }
  }
}
Nach dem Login kopieren

多线程的ServerSocket

多线程的好处不用多说,而且大多数的场景都是多线程的,无论是我们的即时类游戏还是IM,多线程的需求都是必须的。下面说说实现方式:

  •  主线程会循环执行ServerSocket.accept();

  •  当拿到客户端连接请求的时候,就会将Socket对象传递给多线程,让多线程去执行具体的操作;

实现多线程的方法要么继承Thread类,要么实现Runnable接口。当然也可以使用线程池,但实现的本质都是差不多的。

这里举例:

下面代码为服务器的主线程。为每个客户分配一个工作线程:


public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();            //主线程获取客户端连接
      Thread workThread=new Thread(new Handler(socket));  //创建线程
      workThread.start();                  //启动线程
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}
Nach dem Login kopieren

当然这里的重点在于如何实现Handler这个类。Handler需要实现Runnable接口:


class Handler implements Runnable{
  private Socket socket;
  public Handler(Socket socket){
    this.socket=socket;
  }
  
  public void run(){
    try{
      System.out.println("新连接:"+socket.getInetAddress()+":"+socket.getPort());
      Thread.sleep(10000);
    }catch(Exception e){e.printStackTrace();}finally{
      try{
        System.out.println("关闭连接:"+socket.getInetAddress()+":"+socket.getPort());
        if(socket!=null)socket.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }
  }
}
Nach dem Login kopieren

当然是先多线程还有其它的方式,譬如线程池,或者JVM自带的线程池都可以。这里就不说明了。

Das obige ist der detaillierte Inhalt vonTeilen von Beispielen für die Socket-Programmierung in Java (Bild). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Der Schlüssel zum Programmieren: Die Leistungsfähigkeit von Python für Anfänger freischalten Der Schlüssel zum Programmieren: Die Leistungsfähigkeit von Python für Anfänger freischalten Oct 11, 2024 pm 12:17 PM

Python ist aufgrund seiner einfachen Erlernbarkeit und leistungsstarken Funktionen eine ideale Einführungssprache in die Programmierung für Anfänger. Zu seinen Grundlagen gehören: Variablen: werden zum Speichern von Daten (Zahlen, Zeichenfolgen, Listen usw.) verwendet. Datentyp: Definiert den Datentyp in der Variablen (Ganzzahl, Gleitkomma usw.). Operatoren: werden für mathematische Operationen und Vergleiche verwendet. Kontrollfluss: Kontrollieren Sie den Fluss der Codeausführung (bedingte Anweisungen, Schleifen).

Problemlösung mit Python: Erschließen Sie leistungsstarke Lösungen als Programmieranfänger Problemlösung mit Python: Erschließen Sie leistungsstarke Lösungen als Programmieranfänger Oct 11, 2024 pm 08:58 PM

Python unterstützt Anfänger bei der Problemlösung. Seine benutzerfreundliche Syntax, umfangreiche Bibliothek und Funktionen wie Variablen, bedingte Anweisungen und Schleifen ermöglichen eine effiziente Codeentwicklung. Von der Datenverwaltung über die Steuerung des Programmablaufs bis hin zur Ausführung wiederkehrender Aufgaben bietet Python

C entmystifizieren: Ein klarer und einfacher Weg für neue Programmierer C entmystifizieren: Ein klarer und einfacher Weg für neue Programmierer Oct 11, 2024 pm 10:47 PM

C ist eine ideale Wahl für Anfänger, um die Systemprogrammierung zu erlernen. Es enthält die folgenden Komponenten: Header-Dateien, Funktionen und Hauptfunktionen. Ein einfaches C-Programm, das „HelloWorld“ drucken kann, benötigt eine Header-Datei mit der Standard-Eingabe-/Ausgabe-Funktionsdeklaration und verwendet zum Drucken die printf-Funktion in der Hauptfunktion. C-Programme können mit dem GCC-Compiler kompiliert und ausgeführt werden. Nachdem Sie die Grundlagen beherrschen, können Sie mit Themen wie Datentypen, Funktionen, Arrays und Dateihandhabung fortfahren, um ein kompetenter C-Programmierer zu werden.

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Entfesseln Sie Ihren inneren Programmierer: C für absolute Anfänger Entfesseln Sie Ihren inneren Programmierer: C für absolute Anfänger Oct 11, 2024 pm 03:50 PM

C ist eine ideale Sprache für Anfänger zum Erlernen des Programmierens. Zu seinen Vorteilen gehören Effizienz, Vielseitigkeit und Portabilität. Das Erlernen der C-Sprache erfordert: Installieren eines C-Compilers (z. B. MinGW oder Cygwin) Verstehen von Variablen, Datentypen, bedingten Anweisungen und Schleifenanweisungen Schreiben des ersten Programms, das die Hauptfunktion und die printf()-Funktion enthält Üben durch praktische Fälle (z. B. Berechnen von Durchschnittswerten) C-Sprachkenntnisse

Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Oct 11, 2024 pm 06:30 PM

Java leicht gemacht: Ein Leitfaden für Anfänger zur leistungsstarken Programmierung Java ist eine leistungsstarke Programmiersprache, die in allen Bereichen von mobilen Anwendungen bis hin zu Systemen auf Unternehmensebene verwendet wird. Für Anfänger ist die Syntax von Java einfach und leicht zu verstehen, was es zu einer idealen Wahl zum Erlernen des Programmierens macht. Grundlegende Syntax Java verwendet ein klassenbasiertes objektorientiertes Programmierparadigma. Klassen sind Vorlagen, die zusammengehörige Daten und Verhaltensweisen organisieren. Hier ist ein einfaches Java-Klassenbeispiel: publicclassPerson{privateStringname;privateintage;

See all articles