Java Socket:Java-NIO-ServerSocketChannel(三)

2014-11-24 08:59:13 · 作者: · 浏览: 6
SocketChannel.open( );
sc.configureBlocking (false);
sc.connect (addr);
while ( ! sc.finishConnect( )) {
doSomethingElse( );
}
doSomethingWithChannel (sc);
sc.close( );
一段用来管理异步连接的可用代码。
[java]
public class SocketChannelApp {
public static void main(String[] args) throws Exception {
InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 8989);
SocketChannel sc = SocketChannel.open();
sc.connect(addr);
sc.configureBlocking(false);
while (!sc.finishConnect()) {
doSomethings();
}
//Do something with the connected socket
ByteBuffer buffer = ByteBuffer.wrap(new String("Hello server!").getBytes());
sc.write(buffer);
sc.close();
}
private static void doSomethings() {
System.out.println("do something useless!");
}
}
server还是采用上篇的 ,我把它简单的改了改
[java]
public class ServerSocketChannelApp {
private static final String MSG = "hello, I must be going \n";
public static void main(String[] args) throws Exception {
int port = 8989;
ServerSocketChannel ssc = ServerSocketChannel.open();
ServerSocket ss = ssc.socket();
ss.bind(new InetSocketAddress(port));
// set no blocking
ssc.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.wrap(MSG.getBytes());
while (true) {
// System.out.println("wait for connection ……");
SocketChannel sc = ssc.accept();
if (sc == null) {
// no connections, snooze a while ...
Thread.sleep(1000);
} else {
System.out.println("Incoming connection from " + sc.socket().getRemoteSocketAddress());
ByteBuffer readerBuffer = ByteBuffer.allocate(1024);
sc.read(readerBuffer);
readerBuffer.flip();
//output get
out(readerBuffer);
buffer.rewind();
sc.write(buffer);
sc.close();
}
}
}
private static void out(ByteBuffer readerBuffer) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < readerBuffer.limit(); i++) {
char c = (char) readerBuffer.get();
sb.append(new String(new char[]{c}));
}
System.out.println(sb.toString());
}
}
ps:
如果尝试异步连接失败,那么下次调用finishConnect( )方法会产生一个适当的经检查的异常以指出问题的性质。通道然后就会被关闭并将不能被连接或再次使用。与连接相关的方法使得我们可以对一个通道进行轮询并在连接进行过程中判断通道所处的状态。第四章中,我们将了解到如何使用选择器来避免进行轮询并在异步连接建立之后收到通知。Socket通道是线程安全的。并发访问时无需特别措施来保护发起访问的多个线程,不过任何时候都只有一个读操作和一个写操作在进行中。请记住,sockets是面向流的而非包导向的。它们可以保证发送的字节会按照顺序到达但无法承诺维持字节分组。某个发送器可能给一个socket写入了20个字节而接收器调用read( )方法时却只收到了其中的3个字节。剩下的17个字节还是传输中。由于这个原因,让多个不配合的线程共享某个流socket的同一侧绝非一个好的设计选择。
connect( )和finishConnect( )方法是互相同步的,并且只要其中一个操作正在进行,任何读或写的方法调用都会阻塞,即使是在非阻塞模式下。如果此情形下您有疑问或不能承受一个读或写操作在某个通道上阻塞,请用isConnected( )方法测试一下连接状态。