簡體   English   中英

套接字服務器未與JavaScript套接字客戶端連接

[英]Socket server not connect with JavaScript socket client

下面是套接字的代碼。

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連接時會引發錯誤。

的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讀取值時,它將引發以下錯誤:

WebSocket與'ws:// localhost:3339 /'的連接失敗:WebSocket握手期間出錯:狀態行無效

但是我可以使用Java代碼在服務器和客戶端之間進行同步。

一個webSocket連接需要一個特定的webSocket服務器,而不僅僅是一個普通的TCP服務器。 當瀏覽器使用webSocket連接時,它具有特定的連接順序(以HTTP請求開始,然后升級為webSocket連接),並且具有特定的安全方案,並且具有用於發送數據的特定數據格式。 服務器必須支持所有這些,才能正確接受瀏覽器的webSocket連接並與之通信。

關於invalid handshake的錯誤僅表示瀏覽器嘗試連接,但服務器未針對webSocket協議提供正確的響應。

由於服務器看起來像是用Java編寫的,因此有許多Java的webSocket服務器實現。 您可能應該抓住其中一個並使用它,而不是自己實現整個webSocket連接方案和協議。

您可能會發現這篇文章很有幫助:

如何使用JSR 356 API構建Java WebSocket應用程序

這是關於其他用於Java的webSocket庫的答案(也許有些過時):

Java中的WebSockets生產就緒服務器?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM