[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java [Back]  [Original]

Java WebSocket - Web API | MDN

MDN Web Docs

View in English Always switch to English

Java WebSocket

Oracle Java WebSocket API

WebSocket Oracle Java

RFC 6455 Chrome 16Firefox 11IE 10

WebSocket TCP () Java ServerSocket java.net

ServerSocket

ServerSocket port int

ServerSocket port

java
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.");

Socket

  • java.net.Socket.getInputStream()
  • java.net.Socket.getOutputStream()

OutputStream

java
write(byte[] b, int off, int len)

byte off len

InputStream

java
read(byte[] b, int off, int len)

len

java
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
Scanner s = new Scanner(in, "UTF-8");

HTTP WebSocket GET

java
try {
  String data = s.useDelimiter("\\r\\n\\r\\n").next();
  Matcher get = Pattern.compile("^GET").matcher(data);

  1. Sec-WebSocket-Key
  2. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
  3. SHA-1 Base64
  4. Sec-WebSocket-Accept HTTP
java
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);

"abcdef"

129 134 167 225 225 210 198 131 130 182 194 135
  • 129:

    FIN () RSV1 RSV2 RSV3 Opcode
    1 0 0 0 0x1=0001

    FIN: Opcode 0x1 Opcode

    • 134:

    2 128 0 125 126 2 (16 )127 8 (64 0 )

    : 1 128

  • 167225225 210

= XOR ( BITWISE 0x3)

Java

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();
    }
  }
}


Web Proxy Viewer  |  New URL  |  Original Page