Java 为什么我要从WebSocket客户端获得两个连接?一是",;“空的”;
当我从Java打开到websocket服务器应用程序的websocket连接时,服务器会看到两个连接。第一个从不发送任何数据,第二个发送所有正确的头,等等。有人知道这是什么原因吗 客户端连接是:Java 为什么我要从WebSocket客户端获得两个连接?一是",;“空的”;,java,websocket,serversocket,Java,Websocket,Serversocket,当我从Java打开到websocket服务器应用程序的websocket连接时,服务器会看到两个连接。第一个从不发送任何数据,第二个发送所有正确的头,等等。有人知道这是什么原因吗 客户端连接是: var websocket = new WebSocket( "ws://192.168.1.19:3333/websession" ); 在服务器端,在一个while循环中,我调用“serverSocket.accept()”,它会被调用两次。但是其中一个从未发送任何数据(in.read()最终只是
var websocket = new WebSocket( "ws://192.168.1.19:3333/websession" );
在服务器端,在一个while循环中,我调用“serverSocket.accept()”,它会被调用两次。但是其中一个从未发送任何数据(in.read()最终只是超时而不返回任何数据)
JAVA服务器代码
import java.net.*;
import java.io.*;
import java.security.*;
public class WebListener {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(-1);
}
while (listening) new ServerThread(serverSocket.accept()).start();
serverSocket.close();
}
}
class ServerThread extends Thread {
private Socket socket = null;
public ServerThread(Socket socket) {
super("ServerThread");
this.socket = socket;
}
public void run() {
try {
OutputStream outStream = null;
PrintWriter out = new PrintWriter( outStream = socket.getOutputStream(), true);
BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));
String inputLine, outputLine;
//Handle the headers first
doHeaders( out, in );
// ..elided..
out.close();
in.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void doHeaders(PrintWriter out, BufferedReader in) throws Exception {
String inputLine = null;
String key = null;
//Read the headers
while ( ( inputLine = in.readLine() ) != null ) {
//Get the key
if ( inputLine.startsWith( "Sec-WebSocket-Key" ) )
key = inputLine.substring( "Sec-WebSocket-Key: ".length() );
//They're done
if ( inputLine.equals( "" ) ) break;
}
//We need a key to continue
if ( key == null ) throw new Exception( "No Sec-WebSocket-Key was passed!" );
//Send our headers
out.println( "HTTP/1.1 101 Web Socket Protocol Handshake\r" );
out.println( "Upgrade: websocket\r" );
out.println( "Connection: Upgrade\r" );
out.println( "Sec-WebSocket-Accept: " + createOK( key ) + "\r" );
out.println( "\r" );
}
public String createOK(String key) throws NoSuchAlgorithmException, UnsupportedEncodingException, Exception {
String uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
String text = key + uid;
MessageDigest md = MessageDigest.getInstance( "SHA-1" );
byte[] sha1hash = new byte[40];
md.update( text.getBytes("iso-8859-1"), 0, text.length());
sha1hash = md.digest();
return new String( base64( sha1hash ) );
}
public byte[] base64(byte[] bytes) throws Exception {
ByteArrayOutputStream out_bytes = new ByteArrayOutputStream();
OutputStream out = new Base64.OutputStream(out_bytes); //Using http://iharder.net/base64
out.write(bytes);
out.close();
return out_bytes.toByteArray();
}
private String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while(two_halfs++ < 1);
}
return buf.toString();
}
}
import java.net.*;
导入java.io.*;
导入java.security.*;
公共类WebListener{
公共静态void main(字符串[]args)引发异常{
ServerSocket ServerSocket=null;
布尔监听=真;
试一试{
serverSocket=新的serverSocket(4444);
}捕获(IOE异常){
System.err.println(“无法侦听端口:4444”);
系统退出(-1);
}
在(侦听)新服务器线程(serverSocket.accept()).start()时;
serverSocket.close();
}
}
类ServerThread扩展线程{
私有套接字=空;
公共服务器线程(套接字){
超级(“服务器线程”);
this.socket=socket;
}
公开募捐{
试一试{
OutputStream outStream=null;
PrintWriter out=新的PrintWriter(outStream=socket.getOutputStream(),true);
BufferedReader in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
字符串输入行、输出行;
//首先处理标题
doHeaders(out,in);
//…省略。。
out.close();
in.close();
socket.close();
}捕获(例外e){
e、 printStackTrace();
}
}
公共void doHeaders(PrintWriter输出,BufferedReader输入)引发异常{
字符串inputLine=null;
字符串键=null;
//阅读标题
而((inputLine=in.readLine())!=null){
//拿到钥匙
if(inputLine.startsWith(“Sec WebSocket键”))
key=inputLine.substring(“Sec WebSocket key:.length());
//完成了
如果(inputLine.equals(“”)中断;
}
//我们需要一把钥匙来继续
如果(key==null)抛出新异常(“未传递Sec WebSocket键!”);
//发送我们的标题
println(“HTTP/1.1 101 Web套接字协议握手\r”);
out.println(“升级:websocket\r”);
out.println(“连接:升级\r”);
out.println(“Sec WebSocket接受:”+createOK(键)+“\r”);
out.println(“\r”);
}
公共字符串createOK(字符串键)抛出NoSuchAlgorithmException、UnsupportedEncodingException、Exception{
字符串uid=“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”;
字符串text=key+uid;
MessageDigest md=MessageDigest.getInstance(“SHA-1”);
字节[]sha1hash=新字节[40];
md.update(text.getBytes(“iso-8859-1”),0,text.length();
sha1hash=md.digest();
返回新字符串(base64(sha1hash));
}
公共字节[]base64(字节[]字节)引发异常{
ByteArrayOutputStream out_bytes=新建ByteArrayOutputStream();
OutputStream out=new Base64.OutputStream(out_字节);//使用http://iharder.net/base64
out.write(字节);
out.close();
返回_字节。toByteArray();
}
私有字符串convertToHex(字节[]数据){
StringBuffer buf=新的StringBuffer();
对于(int i=0;i>>4)&0x0F;
int two_halfs=0;
做{
如果((0这看起来是Firefox的一个bug。在Chrome中,它只打开一个连接,而在Firefox 15中,同一页面打开两个连接。我相信这是“JavaScript”,不是Java。Q:你能告诉我们服务器部分吗?Q:有错误吗?它是Java,因为我在问我的服务器可以做什么来检测这个无用的连接,以及我得到它是否是因为我这边的错误。有意思。这些链接可能会导致一些看起来像“额外连接”的东西:@paulsm4这是一个有趣的错误,但我认为不太可能是因为我在连接之后(即在onOpen函数中)在javascript中包含websocket.close()
,它仍然会建立两个连接。(即使我反复刷新它)