[英]Implements observer pattern on socket client server
每个客户端连接到服务器后即注册为观察者。 当任何客户端进行更改时,将通知另一个客户端。
我的问题是如何保持套接字连接?
我可以存储所有类似Socket[]
连接并每秒检查其InputStream
吗?
我不知道我是否解决您的问题...但是我会给您一个机会。
问题是,您有1个ServerSocket和多个套接字(每个客户端一个),现在您想获得有关这些套接字的活动性的通知/通知。 所以您打算遍历套接字列表?
关键字是非阻塞I / O。 搜索关键字“选择器”或“多路复用”。 我将尝试举一个简单的例子。
我建立了一个非常小的例子。 但这是一个开始。 这是整体
package server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;
import java.util.Iterator;
import java.util.Set;
public class Server {
public Server() throws IOException{
Selector selector = SelectorProvider.provider().openSelector();
ServerSocketChannel ssc = ServerSocketChannel.open().bind(new InetSocketAddress(9000));
ssc.configureBlocking(false);
ssc.register(selector,
SelectionKey.OP_ACCEPT);
while(true) {
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if(key.isAcceptable()) {
System.out.println("acceptable");
SocketChannel socketChan = ((ServerSocketChannel)key.channel()).accept();
socketChan.configureBlocking(false);
socketChan.register(selector, SelectionKey.OP_READ);
} else if (key.isConnectable()) {
// a connection was established with a remote server.
} else if (key.isReadable()) {
System.out.println("Processing reading...");
ByteBuffer buf = ByteBuffer.allocate(1024);
int readedBytes = ((SocketChannel)key.channel()).read(buf);
System.out.println("Readed: " + readedBytes);
buf.flip();
for(byte b : buf.array()) {
System.out.print((char) b);
}
} else if (key.isWritable()) {
// a channel is ready for writing
}
keyIterator.remove();
}
}
}
public static void main(String[] args) throws IOException {
Server server = new Server();
}
}
我可以运行它,并通过端口9000上的netcat连接到它,并从那里发送消息。 只需一个线程,即可根据需要选择尽可能多的客户端连接。
我使用了此资源/示例
http://tutorials.jenkov.com/java-multithreaded-servers/thread-pooled-server.html和http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/index。 html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.