套接字服务器未与 JavaScript 套接字客户端连接 [英] Socket server not connect with JavaScript socket client

查看:36
本文介绍了套接字服务器未与 JavaScript 套接字客户端连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是socket的代码.

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

    }
}

当我尝试连接 Java 套接字客户端时,上面的代码工作正常.不知道为什么在连接 JavaScript 时会抛出错误.

The above code is working fine when I try to connect with Java socket client. Am not sure why it throwing error when connect with 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);
    }

当我尝试从 JavaScript 读取值时,它抛出以下错误:

When I try to read the value from JavaScript, it throws the following error:

WebSocket 连接到 'ws://localhost:3339/' 失败:WebSocket 握手期间出错:状态行无效

WebSocket connection to 'ws://localhost:3339/' failed: Error during WebSocket handshake: Invalid status line

但我可以使用 Java 代码在服务器和客户端之间同步.

But I can able to sync up between server and client by using Java code.

推荐答案

一个 webSocket 连接需要一个特定的 webSocket 服务器,而不仅仅是一个普通的 TCP 服务器.当浏览器使用 webSocket 连接时,它有一个特定的连接序列(从 HTTP 请求开始,然后升级为 webSocket 连接),它有一个特定的安全方案,它有一个特定的数据格式来发送数据.服务器必须支持所有这些才能正确接受来自浏览器的 webSocket 连接并与之通信.

A webSocket connection requires a specific webSocket server, not just a plain TCP server. 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. The server must support all that in order to properly accept and communicate with a webSocket connection from a browser.

关于invalid handshake 的错误只是表明浏览器尝试连接,但服务器没有为 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.

由于您的服务器看起来像是 Java 语言,因此有许多 Java 的 webSocket 服务器实现.您可能应该抓住其中之一并使用它,而不是自己实现整个 webSocket 连接方案和协议.

Since it looks like your server is in Java, there are numerous webSocket server implementations for Java. You should probably grab one of those and use it rather than implementation the whole webSocket connection scheme and protocol yourself.

您可能会发现这篇文章很有帮助:

You may find this article helpful:

如何使用 JSR 356 API 构建 Java WebSocket 应用程序

这里有一个关于 Java 的其他 webSocket 库的答案(可能有点过时):

And here's an answer (a little dated perhaps) about other webSocket libraries for Java:

Java 中的 WebSockets 生产就绪服务器?

这篇关于套接字服务器未与 JavaScript 套接字客户端连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆