| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Dieses Beispiel zeigt Ihnen, wie Sie einen WebSocket-API-Server mit Oracle Java erstellen.
Obwohl andere serverseitige Sprachen verwendet werden knnen, um einen WebSocket-Server zu erstellen, verwendet dieses Beispiel Oracle Java, um den Beispielcode zu vereinfachen.
Dieser Server entspricht RFC 6455 und behandelt daher nur Verbindungen von Chrome ab Version 16, Firefox 11, IE 10 und hher.
WebSockets kommunizieren ber eine TCP (Transmission Control Protocol)-Verbindung. Die ServerSocket-Klasse von Java befindet sich im java.net-Paket.
Der ServerSocket-Konstruktor akzeptiert einen einzelnen Parameter port vom Typ int.
Wenn Sie die ServerSocket-Klasse instanziieren, wird sie an die Portnummer gebunden, die Sie durch das port-Argument angegeben haben.
Hier ist eine Implementierung, aufgeteilt in Teile:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebSocket {
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
ServerSocket server = new ServerSocket(80);
try {
System.out.println("Server has started on 127.0.0.1:80.\r\nWaiting for a connection");
Socket client = server.accept();
System.out.println("A client connected.");
java.net.Socket.getInputStream()Gibt einen Eingabestrom fr diesen Socket zurck.
java.net.Socket.getOutputStream()Gibt einen Ausgabestrom fr diesen Socket zurck.
write(byte[] b, int off, int len)
Schreibt len Bytes aus dem angegebenen Bytearray, beginnend bei Offset off, in diesen Ausgabestrom.
read(byte[] b, int off, int len)
Liest bis zu len Bytes Daten aus dem Eingabestrom in ein Bytearray.
Lassen Sie uns unser Beispiel erweitern.
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
Scanner s = new Scanner(in, "UTF-8");
Wenn ein Client eine Verbindung zu einem Server herstellt, sendet er eine GET-Anfrage, um die Verbindung von einer einfachen HTTP-Anfrage auf einen WebSocket aufzursten. Dies wird als Handshaking bezeichnet.
try {
String data = s.useDelimiter("\\r\\n\\r\\n").next();
Matcher get = Pattern.compile("^GET").matcher(data);
Das Erstellen der Antwort ist einfacher, als zu verstehen, warum Sie es auf diese Weise tun mssen.
Sie mssen:
if (get.find()) {
Matcher match = Pattern.compile("Sec-WebSocket-Key: (.*)").matcher(data);
match.find();
byte[] response = ("HTTP/1.1 101 Switching Protocols\r\n"
+ "Connection: Upgrade\r\n"
+ "Upgrade: websocket\r\n"
+ "Sec-WebSocket-Accept: "
+ Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-1").digest((match.group(1) + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes("UTF-8")))
+ "\r\n\r\n").getBytes("UTF-8");
out.write(response, 0, response.length);
Nach einem erfolgreichen Handshake kann der Client Nachrichten an den Server senden, aber jetzt sind diese kodiert.
Wenn wir "abcdef" senden, erhalten wir diese Bytes:
129 134 167 225 225 210 198 131 130 182 194 135
129:
| FIN (Ist dies die gesamte Nachricht?) | RSV1 | RSV2 | RSV3 | Opcode |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0x1=0001 |
FIN: Sie knnen Ihre Nachricht in Frames senden, aber jetzt halten Sie es einfach. Opcode 0x1 bedeutet, dass dies ein Text ist. Vollstndige Liste der Opcodes
134:
Wenn das zweite Byte minus 128 zwischen 0 und 125 liegt, ist dies die Lnge der Nachricht. Wenn es 126 ist, sind die folgenden 2 Bytes (16-Bit-Unsigned-Integer), wenn 127, die folgenden 8 Bytes (64-Bit-Unsigned-Integer, das hchstwertige Bit MUSS 0 sein) die Lnge.
Hinweis: Es kann 128 annehmen, da das erste Bit immer 1 ist.
167, 225, 225 und 210 sind die Bytes des Schlssels zum Dekodieren. Sie ndern sich jedes Mal.
Die verbleibenden kodierten Bytes sind die Nachricht.
Dekodiertes Byte = Kodiertes Byte XOR (Position des kodierten Bytes BITWEISE UND 0x3)tes Byte des Schlssels
Beispiel in Java:
byte[] decoded = new byte[6];
byte[] encoded = new byte[] { (byte) 198, (byte) 131, (byte) 130, (byte) 182, (byte) 194, (byte) 135 };
byte[] key = new byte[] { (byte) 167, (byte) 225, (byte) 225, (byte) 210 };
for (int i = 0; i < encoded.length; i++) {
decoded[i] = (byte) (encoded[i] ^ key[i & 0x3]);
}
}
} finally {
s.close();
}
} finally {
server.close();
}
}
}
Der Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |