当前位置: 首页 > 知识库问答 >
问题:

为什么我从网页平台客户端获得两个连接?一个是“空的”

孙项禹
2023-03-14

当我从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();
    } 
}

共有1个答案

公冶京
2023-03-14

这看起来是火狐的一个错误。在Chrome中,它只打开一个连接,而火狐15中的同一页面打开两个连接。

 类似资料:
  • 问题内容: 我很好奇为什么要尝试将2个客户端连接到RedisDB而不是1个?每次我连接时,都会看到另外两个客户端连接到我的RedisDB。 问题答案: 因为redis要求交互式命令和发布/订阅的单独连接。如果您不使用pub / sub,则可以告诉选项以禁用命令,在这种情况下,我 认为 第二个连接未建立。

  • 我有一个这样描述的任务: 实现调用按钮: 当点击通话图标时,first Twilio会拨打电话号码#1(管理员) 这时我想出了如何通过浏览器拨打电话号码(比如管理员可以在浏览器中拨打提供商的电话)。 但是我找不到任何信息,如何通过Twilio相应地连接人们的任务。有什么方法可以实现这个解决方案吗?

  • 问题内容: 我正在看下面的代码片段: 从这里:http : //howtonode.org/node-redis- fun 。 我不太了解发生了什么。从示例中,我认为Redis客户端是数据库和程序员之间的某种接口,但现在看来他们正在为每个提交的代码创建一个新客户端(他们在教程中构建的应用程序接受代码段)提交并将其存储在数据库中)! 另外,Redis数据库存储在哪里?与脚本位于同一目录中吗?我该如何

  • 我试图创建一个简单的python聊天界面,但是当两个客户端连接到服务器时,第一个客户端控制台会尽快打印空白,并导致最大递归深度错误,而第二个客户端仍然可以正常工作。服务器代码只在非空时发送数据,所以我不确定它为什么会这样做。 服务器代码: 客户代码: 错误出现在客户机代码的第19行(接收和打印服务器发送的任何数据),如有任何帮助,将不胜感激。

  • 问题内容: 我们最近开始开发Java桌面应用程序,并且管理部门要求我们使用Rich Client Platform。我知道Java有四个: Eclipse RCP- www链接到ecipse rcp, Netbean RCP- Netbeans RCP网站, Spring RCP- Spring Rich Client Valkyrie RCP- Valkyrie富客户端 任何人都没有任何经验,如

  • 问题内容: 一切工作正常,但问题是当我在地图上定位时什么都没发生我注册了我的谷歌地图,我在这里做了所有说明 http://code.google.com/intl/pl/android/add-ons/google- apis/mapkey.html 我可以看到地图,可以放大和缩小,但是当我搜索位置时,会在logcat中找到它 这是我的Java代码 有什么帮助吗?提前致谢 问题答案: 如果您在AP