byte-java WebSocket 相关 前端已经接收到值了,为什么后台代码还是会出异常呀

问题描述

java WebSocket 相关 前端已经接收到值了,为什么后台代码还是会出异常呀

java Web Socket 初学者 最近遇到了一个问题 ,就是在后台向前端推送数据时前台页面明明接收到了值,但是后台代码还是会出异常这是为什么!
下面是我写的代码

这个是主线程代码

 package test;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {

    // 记录所有客户端的Socket
    public static List<Socket> clientSocket = new ArrayList<Socket>();

    public ChatServer() throws Exception {
        // 创建ServerSocket,准备接受客户端连接
        ServerSocket ss = new ServerSocket(30000);
        while (true) {

            System.out.println(clientSocket.size());
            // 接收客户端连接
            Socket socket = ss.accept();
            // 将客户端Socket添加到clientSocket集合中
            clientSocket.add(socket);
            // 启动线程
            new ServerThread(socket).start();

        }
    }

    public static void main(String[] args) throws Exception {
        new ChatServer();

    }

}

下面是线程内代码

 package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.MessageDigest;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import sun.misc.BASE64Encoder;

public class ServerThread extends Thread{
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    private int as = 0;
    @SuppressWarnings("finally")
    public void run() {

            System.out.println("为用户:" + socket.getInetAddress().getHostName()
                    + "开启线程");
            try {
                // 得到Socket对应的输入流
                InputStream is = socket.getInputStream();
                // 得到Socket对应的输出流
                OutputStream out = socket.getOutputStream();
                byte[] buff = new byte[1024];
                String req = "";
                // 读取数据,此时建立与wabSocket的握手
                int count = is.read(buff);
                // 如果读取的数据长度>0
                if (count > 0) {
                    // 将读取的数据转化为字符串
                    req = new String(buff, 0, count);
        //          System.out.println("握手请求:" + req);// req = 客户端信息
                    // 获取WebSocket的值
                    String seckey = getSecWebSocketKey(req);
                    String response = "HTTP/1.1 101 Switching ProtocolsrnUpgrade: "
                            + "websocketrnConnection: UpgradernSec-WebSocket-Accept: "
                            + getSecWebSocketAccept(seckey) + "rnrn";

                    System.out.println("secAccept = " + getSecWebSocketAccept(seckey));
                    //推送客户端
                         out.write(response.getBytes("utf-8"));
                    int hasRedad = 0;
                    // 不断读取WebSocket发送过来的数据
                    System.out.println("while循环前,等待前端推送数据。。。。。。。。。。。。");
                    while ((hasRedad = is.read(buff)) > 0) { //必须这么写
                        System.out.println("接收到客户端"
                                + socket.getInetAddress().getHostName() + "字节数:"
                                + hasRedad);
                        /*
                         * 因为WebSocket发送过来的数据遁寻了一定的协议格式, 其中第3~6个字节是数据掩码,
                         * 从第七个字节开始才是真正的有效数据。 因此程序使用第3~6个字节对后面的数据进行了处理
                         */
                        for (int i = 0; i < hasRedad - 6; i++) {
                            buff[i+6] = (byte)(buff[i%4+2]^ buff[i+6]);
                        }
                        //获得从浏览器发送过来的数据
                        String pushMsg = new String(buff, 6, hasRedad-6, "utf-8");
                        //遍历Socket集合,依次向每个Socket发送数据
                        int a=1;
                        for(Iterator<Socket> it = ChatServer.clientSocket.iterator();it.hasNext();){
                                //获得集合中的Socket对象
                            System.out.println("Socket集合中有:"+ChatServer.clientSocket.size()+"个对象等待发送信息");
                                Socket s = it.next();
                                //发送数据时,第一个字节必须与读到的第一个字节相同
                                byte[] pushHead = new byte[2];
                                pushHead[0] = buff[0];
                                //发送数据时,第二个字节记录 发送数据的长度
                                pushHead[1] = (byte)pushMsg.getBytes("utf-8").length;
                                try {
                                    System.out.println("web推送前");
                                        System.out.println("Socket 的InputStream值:"+is.available());

                                            System.out.println("web推送中........");
                                            //发送前两个字节
                                            s.getOutputStream().write(pushHead);
                                            //发送有效数据
                                            s.getOutputStream().write(pushMsg.getBytes("utf-8"));
                                } catch (Exception e) {
                                    System.out.println("向前端推送数据后发生了异常");
                                    e.printStackTrace();
                                }finally{
                                    //如果s.getInputStream().available() == 0,表明该Scoket已经关闭
                                    //将该Socket从Socket集合中删除
                                    System.out.println("从集合中删除该Socket对象");
                                    ChatServer.clientSocket.remove(s);
                                    a=2;
                                    break;
                                }
                                }
                                System.out.println("WEB 推送后");
                        if(a==2){
                            break;
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("有一个Socket对象关闭了,该对象线程结束");
            }finally{
                    try {
                        //关闭Socket
                        System.out.println("关闭该Socket对象");
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }
    }

    // 获取WebSocket请求的Seckey
    private String getSecWebSocketKey(String req) {
        // 构建正则表达式,获取Sec-WebSocket-Key:后面的内容
        Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
        Matcher m = p.matcher(req);
        if (m.find()) {
            // 提取Sec-WebSocket-Key
            String foundstring = m.group();
            return foundstring.split(":")[1].trim();
        } else {
            return null;
        }
    }

    // 根据WebSocket请求的Seckey计算SecAccept
    private String getSecWebSocketAccept(String key) throws Exception {
        String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
        key += guid;
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(key.getBytes("ISO-8859-1"), 0, key.length());
        byte[] shalHash = md.digest();
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(shalHash);
    }

}

没有错误信息,不报错的 但是就是程序走不了了

解决方案

1.给出异常信息;
2.不要写错字错句。

解决方案二:

错别字,不好意思 是我粗心大意了 但是这个小程序真的不报错的,但是就是程序走不下去了 不信您可以自己粘贴下来试试

时间: 2024-09-22 21:55:36

byte-java WebSocket 相关 前端已经接收到值了,为什么后台代码还是会出异常呀的相关文章

用java WebSocket做一个聊天室_java

最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结构图:很简单,就1个类,1个页面 然后看具体代码 先看后端代码 package com.main; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.

java socket 文件传输-java socket 传文件文件接收后不能打开

问题描述 java socket 传文件文件接收后不能打开 java socket传文件,客户端将文件读取到byte[]中,然后用Map对相关内容进行包装之后输出到服务器端,但服务器端读取文件内容的循环除第一次读取的Map是客户端写入过来的内容外,从第二次循环开始Map的内容都跟第一次一样的,请问怎么回事? 服务器端代码: `public void run() { ObjectInputStream is = null; OutputStream os = null; byte cache[]

java-关于Java中Extjs前端与后台之间的数据交互

问题描述 关于Java中Extjs前端与后台之间的数据交互 本人java新手,最近新进一家公司,前端用的是Extjs,但是这个Extjs以前都没接触过,所以求大神能不能发我一个Extjs前端与java后台之间的数据交互的实例(前端输入数据,后台根据该数据在数据库中查,然后返回对应数据到前端,前端显示返回的数据),最好是用SH2框架.发我邮箱cgjiangpan@163.com,非常感谢.!!! 解决方案 网上那么多,就是通过json传输数据,如果你想用extjs,建议买本书先学习一下 解决方案二

java求相关源代码,求大神帮忙,对于你们可能很简单,拜托啦

问题描述 java求相关源代码,求大神帮忙,对于你们可能很简单,拜托啦 要求是需要一个客户端软件和服务器软件,客户端通过启动一个图形界面调用一个指定文件夹里的指定名称的语音数据联网发送给服务器,服务器处理后再把处理结果发给客户端.拜托各位啦! 解决方案 就是post字节数组 byte[],网上都是现成的代码,自己找一个吧 解决方案二: 打开该语音文件,将内容读取为字节数组,使用HttpClient将该数组发送给服务端(HTTP协议),然后服务器端使用servlet接受该请求和内容进行分析,再使用

java发送HttpClient请求及接收请求结果过程的简单实例_java

一. 1.写一个HttpRequestUtils工具类,包括post请求和get请求 package com.brainlong.framework.util.httpclient; import net.sf.json.JSONObject; import org.apache.commons.httpclient.HttpStatus; import org.apache.http.HttpResponse; import org.apache.http.client.methods.Htt

动态-新人发帖 java语言相关

问题描述 新人发帖 java语言相关 第一次发帖,,, 因为一个界面上面有多个窗体 我无论在界面上点击哪里 如何让程序知道我点击的是哪个位置? 窗体? 控件? 只要知道了 我就能做后续的工作 解决方案 每个窗体都有自己的大小位置等各种属性~ 给窗体添加一个监听,当点击的时候执行哪些事件就可以了~ 解决方案二: 其实我能想到两种方法 一种反射 一种就是动态生成事件 但是动态生成太占资源 如果哦界面上有一百个事件 就要有一百个监听 所以我现在想的是反射= = ... 但是有思路就是不知道怎么做 求给

JAVA中byte 、short为什么能赋常量的值,却不能赋变量的值

问题描述 JAVA中byte .short为什么能赋常量的值,却不能赋变量的值 byte b1= 1; byte b2 =2; byte b3 =b1+b2; 这种编译为什么会报错,求指导? 解决方案 道理很简单,两个byte相加的结果byte未必能装下.比如byte b1 = 129; byte b2 = 129; 你说 byte b = b1 + b2 = ? 解决方案二: b1和b2相加的结果值默认是int类型的,改为这样就正确了;byte b3 = (byte)(b1+b2); 解决方案

java数据的传递与接收

问题描述 java数据的传递与接收 我在用spring做网页开发,jsp怎么向服务器传值,controller怎么接收.求大神指导 解决方案 我在用spring做网页开发,jsp怎么向服务器传值,controller怎么接收.? 首先,jsp通过form表单提交数据,controller可以用springmvc来做,它能截取到表单要提交到的地方.提取表单的数据. 然后通过spring来管理各个bean,如数据库操作的对像等.根据表单提交的数据.取出serivce层中的bean对数据库进行操作.

求关于java/JSP相关的英文文献

问题描述 请问各位大哥谁有关于java/JSP相关的英文文献,最好带中文翻译,毕业设计用.有的话,请发送到我的邮箱447484571@qq.com,万二分感谢!