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

问题描述:

下面是套接字的代码。套接字服务器未与JavaScript套接字客户端连接

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 connection to 'ws://localhost:3339/' failed: Error during WebSocket handshake: Invalid status line

但我可以能够通过使用Java代码的服务器和客户端之间同步上涨。

+1

一个WebSocket连接需要webSocket服务器,而不仅仅是一个普通的TCP服务器。有一个明确的webSocket协议必须被服务器支持。 – jfriend00

+0

websocket是一个通过http设计的特殊协议,通过增强http头,你的服务器需要符合web socket协议 – Sanjeev

+0

@Sanjeev http://*.com/questions/38752467/error-during-websocket-handshake-unexpected-response -code-404-时,试图到C –

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

关于invalid handshake的错误只是表明浏览器尝试连接,但服务器没有为webSocket协议提供正确的响应。

由于它看起来像您的服务器在Java中,所以有很多用于Java的webSocket服务器实现。您应该可以抓住其中一个并使用它,而不是自己实现整个webSocket连接方案和协议。

你会发现这篇文章有帮助:

How to build Java WebSocket Applications Using the JSR 356 API

这里对Java的答案(或许有点过时)关于其他的WebSocket库:

WebSockets production ready server in Java?