import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
public class UDPEchoServerSelector {
private static final int TIMEOUT = 3000; // Wait timeout (milliseconds)
private static final int ECHOMAX = 255; // Maximum size of echo datagram
public static void main(String[] args) throws IOException {
if (args.length != 1) // Test for correct argument list
throw new IllegalArgumentException("Parameter(s): <Port>");
int servPort = Integer.parseInt(args[0]);
// Create a selector to multiplex client connections.
Selector selector = Selector.open();
DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(servPort));
channel.register(selector, SelectionKey.OP_READ, new ClientRecord());
while (true) { // Run forever, receiving and echoing datagrams
// Wait for task or until timeout expires
if (selector.select(TIMEOUT) == 0) {
System.out.print(".");
continue;
}
// Get iterator on set of keys with I/O to process
Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
while (keyIter.hasNext()) {
SelectionKey key = keyIter.next(); // Key is bit mask
// Client socket channel has pending data?
if (key.isReadable())
handleRead(key);
// Client socket channel is available for writing and
// key is valid (i.e., channel not closed).
if (key.isValid() && key.isWritable())
handleWrite(key);
keyIter.remove();
}
}
}
public static void handleRead(SelectionKey key) throws IOException {
DatagramChannel channel = (DatagramChannel) key.channel();
ClientRecord clntRec = (ClientRecord) key.attachment();
clntRec.buffer.clear(); // Prepare buffer for receiving
clntRec.clientAddress = channel.receive(clntRec.buffer);
if (clntRec.clientAddress != null) { // Did we receive something?
// Register write with the selector
key.interestOps(SelectionKey.OP_WRITE);
}
}
public static void handleWrite(SelectionKey key) throws IOException {
DatagramChannel channel = (DatagramChannel) key.channel();
ClientRecord clntRec = (ClientRecord) key.attachment();
clntRec.buffer.flip(); // Prepare buffer for sending
int bytesSent = channel.send(clntRec.buffer, clntRec.clientAddress);
if (bytesSent != 0) { // Buffer completely written?
// No longer interested in writes
key.interestOps(SelectionKey.OP_READ);
}
}
static class ClientRecord {
public SocketAddress clientAddress;
public ByteBuffer buffer = ByteBuffer.allocate(ECHOMAX);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java TCP_IP Socket编程源代码.zip (39个子文件)
Java TCP_IP Socket编程源代码
Chapter2
TCPEchoClient.java 2KB
InetAddressExample.java 2KB
UDPEchoClientTimeout.java 2KB
UDPEchoServer.java 1KB
TCPEchoClientGUI.java 3KB
TCPEchoServer.java 1KB
Chapter3
VoteMsgBinCoder.java 3KB
LengthFramer.java 1KB
Framer.java 195B
VoteClientUDP.java 2KB
VoteMsgTextCoder.java 2KB
VoteServerUDP.java 1KB
BruteForceCoding.java 2KB
VoteMsgCoder.java 171B
VoteService.java 726B
VoteClientTCP.java 2KB
VoteServerTCP.java 1KB
VoteMsg.java 2KB
DelimFramer.java 1KB
Chapter5
TCPProtocol.java 272B
TCPEchoClientNonblocking.java 2KB
EchoSelectorProtocol.java 2KB
UDPEchoServerSelector.java 3KB
TCPServerSelector.java 2KB
Chapter6
CompressClient.java 2KB
CompressClientNoDeadlock.java 2KB
Chapter4
FileClientApplet.html 1KB
CompressProtocol.java 2KB
TCPEchoServerThread.java 1KB
TCPEchoServerExecutor.java 1KB
EchoProtocol.java 2KB
FileClientApplet.java 1KB
VoteMulticastReceiver.java 1KB
TCPFileServer.java 2KB
CompressClient.java 2KB
TCPEchoServerPool.java 1KB
ThreadExample.java 775B
TimeLimitEchoProtocol.java 2KB
VoteMulticastSender.java 1KB
共 39 条
- 1
资源评论
让学习成为一种习惯
- 粉丝: 1
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功