2 a1003865572 a1003865572 于 2015.06.13 21:19 提问

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 Protocols\r\nUpgrade: "
                            + "websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "
                            + getSecWebSocketAccept(seckey) + "\r\n\r\n";

                    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);
    }

}

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

2个回答

LogicTeamLeader
LogicTeamLeader   2015.06.13 21:55

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

a1003865572
a1003865572   2015.06.13 23:13

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java web 后台接收到中文乱码
界面上实现用户登陆功能,登陆名是中文,post到后台接收到是乱码。前端与台后均试过url编解码,但没用。于是将dopost里的字符集全改成gb2312就好了。 response.setContentType("text/html;charset=gb2312"); request.setCharacterEncoding("gb2312"); respo
Ajax请求在后台已执行,但是前台显示404
可能是后台忽略了注解@ResponseBody,这个注解的作用是将函数返回值作为请求返回值。没有这个注解的话,请求的响应应该是一个页面,不需要页面的话应该加上这个注解。
html5开发之websocket乱码
今天通过myeclipse写了一个websockt程序,但是html5界面始终出现乱发,编码方式明明是utf-8啊.研究了大半天才找到原因。 因为在myeclipse新建的是html文件,如果新建jsp文件,然后将该jsp文件再重写为html5文件,就没有这种问题了,不知道什么原因,可能是编码不统一的问题吧,各位高手有没有出现这种情况的,求指导
前端接收不到后台发来的JSON问题原因
昨天在做一个头像上传的功能,要求选择完成图片以后立刻完成上传功能并且在页面上显示,需要用到异步上传,就是用了ajaxSubmit()进行表单的上传操作,但是不管怎么弄前台都接收不到后端发来的json数据,设置dataType为text倒是能接收到,郁闷了好长时间。
使用websocket来监控是否异常退出或异常关闭登陆窗口
解决的实际问题: 前端用户登陆时同一个账号密码只允许在一个IP上登陆; 同一个IP只允许登陆一个账户密码。 知识点:websocket获取本机IP&websocket前后端消息推送 主要实现思路: 1.前端websocket 推送消息,创建一个new websocket,将前端的部分参数传给后台 sendMsg()  //发送数据 2.前后
前端如何接收 websocket 发送过来的实时数据
前端如何接收 websocket 发送过来的实时数据标签: websocket, jquery, 实时数据传输技术WebSocket protocol 是HTML5一种新的协议,它实现了浏览器与服务器全双工通信(full-duple)。刚开始的握手需要借助HTTP请求完成,在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后浏览器和服务器之间就形成了一条快速通道,两者之间就直接
Ajax传值后台收到的是null
浏览器里看到的是处理好的字符串,后端可以拿到除了commodityId之外的三个数据,只有它会转换成null,不知道为什么。
websocket+java+tomcat推送数据到前台
原地址:http://blog.chenzuhuang.com/archive/28.html 步骤: 1、新建html页面,代码如下 2、新建java类,代码如下 3、要求:Tomcat从7.0.27开始支持WebSocket,从7.0.47开始支持JSR-356,下面的Demo代码也是需要部署在Tomcat7.0.47上才能运行。 前端代码: webSock
后台接收JSON数据乱码的解决方案
后台接收JSON数据乱码的解决方案   前台将表单数据序列化为JSON格式后,通过$.ajax()函数提交,后台采用struts2的自动表单封装,发现写入数据库中的数据是乱码。   问题出在tomcat上。我们需要修改tomcat的server.xml文件,配置字符编码。
用webSocket发送消息怎么确定用户收到消息了呢
用webSocket发送消息怎么确定用户收到消息了呢 [问题点数:40分]             不显示删除回复           显示所有回复            显示星级回复           显示得分回复            只显示楼主          收藏 sinat_24367905 sinat_24367905