javascript - Java Server Socket 传输 String 到 web socket

标签 javascript java sockets websocket

我的目标是在 Java 服务器套接字和浏览器之间建立连接(使用网络套接字)。到目前为止,连接有效,但我的数据流没有。我想从服务器套接字发送一个字符串到网络套接字。

问题是输入和输出流。 Web 套接字将“zustimmung”发送到服务器套接字,服务器套接字由 in.readLine()run() 中读取。但这并没有读取字符串,它读取的是“GET/HTTP/1.1”。

输出也不起作用(我猜这是由于 writeUTF())。

所以我的问题是:我可以使用哪些数据流在 Web 套接字和服务器套接字之间传输字符串?

代码服务器:

import java.net.*;
import java.io.*;

public class ServerCommunicator extends Thread{

    private final static int PORT = 7777;

    private static ServerSocket serverSocket;
    private static Server server;

    private Socket incoming;
    private DataOutputStream out;
    private DataInputStream in;

    public static void main (String args[]) 
    {
        try {
            serverSocket = new ServerSocket (PORT);
            System.out.println("Waiting for Clients..");

            server = new Server();

            while (true) {
                Socket incoming = serverSocket.accept();
                ServerCommunicator communicator = new ServerCommunicator(incoming);
                communicator.start();
            }
        }catch (Exception e) {e.printStackTrace();}
    }

    public ServerCommunicator (Socket incoming)
    {
        this.incoming = incoming;

        try {
            out = new DataOutputStream (incoming.getOutputStream());
            in = new DataInputStream (incoming.getInputStream());
        } catch (Exception e) {e.printStackTrace();}
    }

        public void run()
        {

            try {
                String input = in.readLine();
                String reply;
                reply = server.auszaehlen(input);   //returns a String
                out.writeUTF(reply);

                out.flush();
                incoming.close();
            } catch (Exception e) {e.printStackTrace();}
        }
}

Javascript 代码 HTML:

<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function WebSocketTest()
{
  if ("WebSocket" in window)
  {
     alert("WebSocket is supported by your Browser!");
     // Let us open a web socket
     var ws = new WebSocket("ws://localhost:7777");
     ws.onopen = function()
     {
        // Web Socket is connected, send data using send()
        ws.send("zustimmung");
        alert("Message is sent...");
     };
     ws.onmessage = function (evt)
     {
        var received_msg = evt.data;
        alert("Message is received...");
     };
     ws.onclose = function()
     {
        // websocket is closed.
        alert("Connection is closed...");
     };
  }
  else
  {
     // The browser doesn't support WebSocket
     alert("WebSocket NOT supported by your Browser!");
  }
}
</script>
</head>
<body>
<div id="sse">
   <a href="javascript:WebSocketTest()">Run WebSocket</a>
</div>
</body>
</html>

最佳答案

当您使用网络套接字连接时,它会发送一个 HTTP 请求,这不仅仅是一个套接字连接。 HTTP 请求打开套接字,发送一些元信息,然后发送数据。

您在服务器上阅读的是该元信​​息的第一行。对您的服务器的典型 HTTP 请求应该是多行,并且应该如下所示:

GET / HTTP/1.1
Host: example.com
Accept: *

zustimmung

您可能需要阅读多个标题行,然后是一个空白行,然后是您的数据。您的服务器只读取一行。您将需要一个循环来读取多行,查找空行,然后读取您的数据。

Wikipedia has good examples请求和响应应该是什么样子。这是他们的示例响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

关于javascript - Java Server Socket 传输 String 到 web socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23780651/

相关文章:

node.js - 客户端建立连接时 Socket.io 服务器没有响应

c++ - 套接字错误的好资源?

javascript - Node.js 错误 ECONNRESET

javascript - 使用 JEST 测试 DOM 元素

javascript - 如何在 JavaScript 中连接字符串数组 - 连接时进行修改

javascript - 如何隐藏/取消隐藏表格?

java - 为什么Java的IDE中没有控制台?

java - 如何阅读 jvm 崩溃报告?报告的原因可能是什么

javascript - 为什么要用函数来定义属性?

java - Spring 异常