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
上传中...
上传图片
插入图片