Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我要从WebSocket客户端获得两个连接?一是",;“空的”;_Java_Websocket_Serversocket - Fatal编程技术网

Java 为什么我要从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()最终只是

当我从Java打开到websocket服务器应用程序的websocket连接时,服务器会看到两个连接。第一个从不发送任何数据,第二个发送所有正确的头,等等。有人知道这是什么原因吗

客户端连接是:

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()
,它仍然会建立两个连接。(即使我反复刷新它)