套接字服务器未与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代码的服务器和客户端之间同步上涨。
答
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库:
一个WebSocket连接需要webSocket服务器,而不仅仅是一个普通的TCP服务器。有一个明确的webSocket协议必须被服务器支持。 – jfriend00
websocket是一个通过http设计的特殊协议,通过增强http头,你的服务器需要符合web socket协议 – Sanjeev
@Sanjeev http://stackoverflow.com/questions/38752467/error-during-websocket-handshake-unexpected-response -code-404-时,试图到C –