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);
}
}
没有错误信息,不报错的 但是就是程序走不了了