il.concurrent.ConcurrentLinkedQueue;
/**
* @author Mathieu Carbou (mathieu.carbou@gmail.com)
*/
final class Endpoints {
private final Queue
endpoints = new ConcurrentLinkedQueue
(); void broadcast(String data) { // for (Endpoint endpoint : endpoints) { // endpoint.onMessage(data); // } } void offer(Endpoint endpoint) { endpoints.offer(endpoint); } void remove(Endpoint endpoint) { endpoints.remove(endpoint); } public WebSocket newEndpoint() { return new Endpoint(this); } }
Endpoint.java
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.codehaus.jettison.json.JSONArray;
import org.eclipse.jetty.websocket.WebSocket;
/**
* @author Mathieu Carbou (mathieu.carbou@gmail.com)
*/
class Endpoint implements WebSocket.OnTextMessage {
protected Connection _connection;
private Endpoints endpoints;
private static int clientCounter = 0;
private int clientId = clientCounter++;
public Endpoint(Endpoints endpoints) {
this.setEndpoints(endpoints);
}
@Override
public void onClose(int code, String message) {
System.out.println("Client disconnected");
this.endpoints.remove(this);
}
@Override
public void onOpen(Connection connection) {
System.out.println("Client connected");
_connection = connection;
try {
this._connection.sendMessage(new JSONArray().put("ClientID = " + clientId).toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
endpoints.offer(this);
}
@Override
public void onMessage(final String data) {
System.out.println("Received data: " + data);
this.endpoints.broadcast(data);
}
public Endpoints getEndpoints() {
return endpoints;
}
public void setEndpoints(Endpoints endpoints) {
this.endpoints = endpoints;
}
}
辅助工具:
在编写服务器最麻烦的是要写对应的客户端来测试,还好Chrome为我们解决了这个问题。下载Chrome插件WebSocket Clinet可以轻松地和服务器建立连接,发送消息到服务器。