今天研究了一下tomcat7的websocket,首先我们看看chrome浏览器的支持的js代码,html5支持websocket
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
var ws = null;
function startServer() {
var url = "ws://192.168.1.109/websocket/helloWorld";
if ('WebSocket' in window) {
ws = new WebSocket(url);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(url);
} else {
alert('浏览器不支持');
return;
}
ws.onopen = function() {
//alert('Opened!');
};
// 收到服务器发送的文本消息, event.data表示文本内容
ws.onmessage = function(event) {
alert('Receive message: ' + event.data);
};
ws.onclose = function() {
// alert('Closed!');
}
}
//发送信息
function sendMessage(){
var textMessage=document.getElementById("textMessage").value;
if(ws!=null&&textMessage!=""){
ws.send(textMessage);
}
}
</script>
<body οnlοad="startServer()">
<input type="text" id="textMessage" size="20" />
<input type="button" οnclick="sendMessage()" value="Send">
</body>
</html>
上面主要是JS的代码,主要是浏览器发送socket给tomcat7,和结束tomcat返回的信息
在web项目中,我们要建一个servlet
package com.auscend.servlet;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
public class HelloWorldWebSocketServlet extends WebSocketServlet{
protected StreamInbound createWebSocketInbound(String subProtocol){
return new MessageInbound() {
@Override
protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
// TODO Auto-generated method stub
}
@Override
protected void onTextMessage(CharBuffer message) throws IOException {
// TODO Auto-generated method stub
System.out.println("onText--->"+message.toString());
Socket socket;
String msg = "";
try {
//向服务器利用Socket发送信息
socket = new Socket("192.168.1.109", 5000);
// socket = new Socket("127.0.0.1",5000);
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.write(message.toString());
output.flush();
//这里是接收到Server的信息
DataInputStream input = new DataInputStream(socket.getInputStream());
byte[] b = new byte[1024];
input.read(b);
//Server返回的信息
msg = new String(b).trim();
output.close();
input.close();
socket.close();
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
//往浏览器发送信息
CharBuffer cb = CharBuffer.wrap(new StringBuilder(msg));
getWsOutbound().writeTextMessage(cb);
}};}}
下面是Server,相当于中央机
public class Server {
/** 端口号 */
public static final int PORT = 5000;
public static void main(String[] args) {
System.out.println("服务器...\n");
Server ser = new Server();
ser.sock();
}
public void sock() {
try {
ServerSocket server = new ServerSocket(PORT);
while (true) {
// 一旦有堵塞, 则表示服务器与客户端获得了连接
Socket client = server.accept();
// 处理这次连接
new PServer(client);
}
} catch (Exception e) {
System.out.println("服务器异常: " + e.getMessage());
}
}
private class PServer implements Runnable {
private Socket socket;
public PServer(Socket sock) {
socket = sock;
new Thread(this).start();
}
public void run() {
System.out.println("一个客户端连接ip:" + socket.getInetAddress());
try {
// 读取客户端数据
DataInputStream input = new DataInputStream(
socket.getInputStream());
// 向客户端发送数据
DataOutputStream out = new DataOutputStream(
socket.getOutputStream());
// 读取客户端数据
// System.out.println("客户端发过来的内容: " + input.readUTF());
byte[] bt = new byte[1024];
int leng = input.read(bt);
System.out.println(new String(bt, 0, leng));
// 发送键盘输入的一行
// String s = new BufferedReader(new
// InputStreamReader(System.in)).readLine();
String s = "server d shu ru";
out.write(s.getBytes());
out.flush();
input.close();
out.close();
socket.close();
} catch (Exception e) {
System.out.println("服务器 run 异常: " + e.getMessage());
}
}
}
}
这里的tomcat是使用的tomcat7.0.28,其他版本方法有点改动,好像是加了一个request的参数