简体   繁体   English

套接字服务器未与JavaScript套接字客户端连接

[英]Socket server not connect with JavaScript socket client

Below is the code for socket. 下面是套接字的代码。

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Random;

public class ChatSocketServer {
    private ServerSocket severSocket = null;
    private Socket socket = null;
    private InputStream inStream = null;
    private OutputStream outStream = null;

    public ChatSocketServer() {

    }

    public void createSocket() {
        try {
            ServerSocket serverSocket = new ServerSocket(3339);
            while (true) {
                socket = serverSocket.accept();
                inStream = socket.getInputStream();
                outStream = socket.getOutputStream();
                System.out.println("Server Connected");
                createReadThread();
                createWriteThread();

            }
        } catch (IOException io) {
            io.printStackTrace();
        }
    }

    public void createReadThread() {
        Thread readThread = new Thread() {
            public void run() {
                while (socket.isConnected()) {
                    try {
                        byte[] readBuffer = new byte[200];
                        int num = inStream.read(readBuffer);
                        if (num > 0) {
                            byte[] arrayBytes = new byte[num];
                            System.arraycopy(readBuffer, 0, arrayBytes, 0, num);
                            String recvedMessage = new String(arrayBytes, "UTF-8");
                            System.out.println("server received :" + recvedMessage);
                        } else {
                            notify();
                        }
                        ;
                        //System.arraycopy();

                    } catch (SocketException se) {
                        System.exit(0);

                    } catch (IOException i) {
                        i.printStackTrace();
                    }

                }
            }
        };
        readThread.setPriority(Thread.MAX_PRIORITY);
        readThread.start();
    }

    public void createWriteThread() {
        Thread writeThread = new Thread() {
            public void run() {

                while (socket.isConnected()) {
                    try {
                        while(true){
                            synchronized (socket) {
                                Random random = new Random();
                                int i = random.nextInt(100);
                                outStream.write(Integer.toString(i).getBytes("UTF-8"));
                                sleep(100);
                            }
                        }/*
                        BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
                        sleep(100);
                        String typedMessage = inputReader.readLine();
                        if (typedMessage != null && typedMessage.length() > 0) {
                            synchronized (socket) {
                                outStream.write(typedMessage.getBytes("UTF-8"));
                                sleep(100);
                            }
                        } else {
notify();
}
                        ;*/
                        //System.arraycopy();

                    } catch (IOException i) {
                        i.printStackTrace();
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }

                }
            }
        };
        writeThread.setPriority(Thread.MAX_PRIORITY);
        writeThread.start();

    }

    public static void main(String[] args) {
        System.out.println("char socket server got started");
        ChatSocketServer chatServer = new ChatSocketServer();
        chatServer.createSocket();

    }
}

The above code is working fine when I try to connect with Java socket client. 当我尝试与Java套接字客户端连接时,上面的代码工作正常。 Am not sure why it throwing error when connect with JavaScript. 不知道为什么在与JavaScript连接时会引发错误。

JavaScript 的JavaScript

try{
    var host = "ws://localhost:3339/";
    var socket = new WebSocket(host);
    console.log(socket.readyState);
    socket.onopen = function(){
        console.log(socket.readyState);
    };
        socket.onmessage = function(msg){
            console.log(msg.data);
        };
        socket.onclose = function(){
            console.log(socket.readyState);
        };          
        socket.onerror = function(error) {
            // connection failed - try polling
            console.log(socket.readyState);
        };

    } catch(exception){
        console.log(exception);
    }

When I try to read the value from JavaScript, it throws the following error: 当我尝试从JavaScript读取值时,它将引发以下错误:

WebSocket connection to 'ws://localhost:3339/' failed: Error during WebSocket handshake: Invalid status line WebSocket与'ws:// localhost:3339 /'的连接失败:WebSocket握手期间出错:状态行无效

But I can able to sync up between server and client by using Java code. 但是我可以使用Java代码在服务器和客户端之间进行同步。

A webSocket connection requires a specific webSocket server, not just a plain TCP server. 一个webSocket连接需要一个特定的webSocket服务器,而不仅仅是一个普通的TCP服务器。 When a browser connects using a webSocket, it has a specific connection sequence (that starts with an HTTP request that is then upgraded to a webSocket connection) and it has a specific security scheme and it has a specific data format for sending data. 当浏览器使用webSocket连接时,它具有特定的连接顺序(以HTTP请求开始,然后升级为webSocket连接),并且具有特定的安全方案,并且具有用于发送数据的特定数据格式。 The server must support all that in order to properly accept and communicate with a webSocket connection from a browser. 服务器必须支持所有这些,才能正确接受浏览器的webSocket连接并与之通信。

The error about an invalid handshake is just an indication that the browser tried to connect, but the server didn't provide the right response for the webSocket protocol. 关于invalid handshake的错误仅表示浏览器尝试连接,但服务器未针对webSocket协议提供正确的响应。

Since it looks like your server is in Java, there are numerous webSocket server implementations for Java. 由于服务器看起来像是用Java编写的,因此有许多Java的webSocket服务器实现。 You should probably grab one of those and use it rather than implementation the whole webSocket connection scheme and protocol yourself. 您可能应该抓住其中一个并使用它,而不是自己实现整个webSocket连接方案和协议。

You may find this article helpful: 您可能会发现这篇文章很有帮助:

How to build Java WebSocket Applications Using the JSR 356 API 如何使用JSR 356 API构建Java WebSocket应用程序

And here's an answer (a little dated perhaps) about other webSocket libraries for Java: 这是关于其他用于Java的webSocket库的答案(也许有些过时):

WebSockets production ready server in Java? Java中的WebSockets生产就绪服务器?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM