赞
踩
改良了网上的一些代码,整理后代码地址:
GitHub
1.服务端代码:
package web.servlet;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
public class SocketServlet extends WebSocketServlet {
private static final long serialVersionUID = -4853540828121130946L;
private static List<MyMessageInbound> mmiList = new ArrayList<MyMessageInbound>();
@Override
protected StreamInbound createWebSocketInbound(String str, HttpServletRequest request) {
return new MyMessageInbound();
}
private class MyMessageInbound extends MessageInbound {
WsOutbound myoutbound;
@Override
public void onOpen(WsOutbound outbound) {
try {
System.out.println("Open Client.");
this.myoutbound = outbound;
mmiList.add(this);
outbound.writeTextMessage(CharBuffer.wrap("Hello!"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClose(int status) {
System.out.println("Close Client.");
mmiList.remove(this);
}
@Override
public void onTextMessage(CharBuffer cb) throws IOException {
System.out.println("Accept Message : " + cb);
for (MyMessageInbound mmib : mmiList) {
CharBuffer buffer = CharBuffer.wrap(cb);
mmib.myoutbound.writeTextMessage(buffer);
mmib.myoutbound.flush();
}
}
@Override
public void onBinaryMessage(ByteBuffer bb) throws IOException {
}
}
}

2.客户端代码:
package web.servlet;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.java_websocket.WebSocketImpl;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_10;
import org.java_websocket.drafts.Draft_17;
import org.java_websocket.drafts.Draft_75;
import org.java_websocket.drafts.Draft_76;
import org.java_websocket.handshake.ServerHandshake;
public class Client extends JFrame implements ActionListener {
private static final long serialVersionUID = -6056260699202978657L;
private final JTextField uriField;
private final JButton connect;
private final JButton close;
private final JTextArea ta;
private final JTextField chatField;
@SuppressWarnings("rawtypes")
private final JComboBox draft;
private WebSocketClient cc;
@SuppressWarnings({ "unchecked", "rawtypes" })
public Client(String defaultlocation) {
super("WebSocket Chat Client");
Container c = getContentPane();
GridLayout layout = new GridLayout();
layout.setColumns(1);
layout.setRows(6);
c.setLayout(layout);
Draft[] drafts = { new Draft_17(), new Draft_10(), new Draft_76(), new Draft_75() };
draft = new JComboBox(drafts);
c.add(draft);
uriField = new JTextField();
uriField.setText(defaultlocation);
c.add(uriField);
connect = new JButton("Connect");
connect.addActionListener(this);
c.add(connect);
close = new JButton("Close");
close.addActionListener(this);
close.setEnabled(false);
c.add(close);
JScrollPane scroll = new JScrollPane();
ta = new JTextArea();
scroll.setViewportView(ta);
c.add(scroll);
chatField = new JTextField();
chatField.setText("");
chatField.addActionListener(this);
c.add(chatField);
java.awt.Dimension d = new java.awt.Dimension(300, 400);
setPreferredSize(d);
setSize(d);
addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (cc != null) {
cc.close();
}
dispose();
}
});
setLocationRelativeTo(null);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == chatField) {
if (cc != null) {
cc.send(chatField.getText());
chatField.setText("");
chatField.requestFocus();
}
} else if (e.getSource() == connect) {
try {
cc = new WebSocketClient(new URI(uriField.getText()), (Draft) draft.getSelectedItem()) {
@Override
public void onMessage(String message) {
ta.append("got: " + message + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
}
@Override
public void onOpen(ServerHandshake handshake) {
ta.append("You are connected to ChatServer: " + getURI() + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
}
@Override
public void onClose(int code, String reason, boolean remote) {
ta.append("You have been disconnected from: " + getURI() + "; Code: " + code + " " + reason
+ "\n");
ta.setCaretPosition(ta.getDocument().getLength());
connect.setEnabled(true);
uriField.setEditable(true);
draft.setEditable(true);
close.setEnabled(false);
}
@Override
public void onError(Exception ex) {
ta.append("Exception occured ...\n" + ex + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
ex.printStackTrace();
connect.setEnabled(true);
uriField.setEditable(true);
draft.setEditable(true);
close.setEnabled(false);
}
};
close.setEnabled(true);
connect.setEnabled(false);
uriField.setEditable(false);
draft.setEditable(false);
cc.connect();
} catch (URISyntaxException ex) {
ta.append(uriField.getText() + " is not a valid WebSocket URI\n");
}
} else if (e.getSource() == close) {
cc.close();
}
}
public static void main(String[] args) {
WebSocketImpl.DEBUG = true;
String location;
if (args.length != 0) {
location = args[0];
System.out.println("Default server url specified: \'" + location + "\'");
} else {
location = "ws://localhost:9002/wsServlet";
System.out.println("Default server url not specified: defaulting to \'" + location + "\'");
}
new Client(location);
}
}

3.servlet配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>web</display-name>
<servlet>
<servlet-name>wsServlet</servlet-name>
<servlet-class>web.servlet.SocketServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>wsServlet</servlet-name>
<url-pattern>/wsServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 设置session时长 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<!-- 首页 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

4.html测试代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>WebSocket Test</title>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<h3 id="test"></h3>
<script>
// 打开Socket(支持浏览器的原生socket方法)
var socket = new WebSocket('ws://localhost:9002/wsServlet');
socket.onopen = function(event) {
socket.send('I am the client and I\'m listening!');
socket.onmessage = function(event) {
console.log('Client received a message', event.data);
$('#test').append(
'Client received a message' + event.data + '</br>');
};
socket.onclose = function(event) {
console.log('Client notified socket has closed', event.data);
$('#test').append(
'Client notified socket has closed' + event.data
+ '</br>');
};
socket.send('I am Hello!');
}
</script>
</body>
</html>

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。