NIO基本(3)
DatagramChannel 是处理UDP协议
1. server
import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.DatagramChannel;import java.nio.charset.Charset;public class DatagramServer {public static void main(String[] args) throws Exception {DatagramChannel channel = DatagramChannel.open();channel.socket().bind(new InetSocketAddress(1234));ByteBuffer bf = ByteBuffer.allocate(1024);while (true) {System.out.println("listening ... ");SocketAddress remoteAddress = channel.receive(bf);new DealClientThread(channel, remoteAddress, bf);}}}class DealClientThread implements Runnable {private DatagramChannel channel;private SocketAddress remoteAddress;private ByteBuffer bf;public DealClientThread(DatagramChannel channel,SocketAddress remoteAddress, ByteBuffer bf) {this.channel = channel;this.remoteAddress = remoteAddress;this.bf = bf;new Thread(this).start();}public void run() {try {// reveivebf.flip();String receivedString = Charset.forName("UTF-8").newDecoder().decode(bf).toString();System.out.println("Receivet client " + remoteAddress.toString()+ " message: " + receivedString);// sendString sendString = "Hi, client(" + remoteAddress.toString()+ ") I had receive your message.";ByteBuffer bfSend = ByteBuffer.wrap(sendString.getBytes("UTF-8"));channel.send(bfSend, remoteAddress);} catch (Exception ex) {ex.printStackTrace();}}}
import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.DatagramChannel;import java.nio.charset.Charset;import java.util.Date;public class DatagramClient {public static void main(String[] args) throws Exception {// sendDatagramChannel channel = DatagramChannel.open();String sendString = "Hi, server. @" + new Date().toString();ByteBuffer sendBuffer = ByteBuffer.wrap(sendString.getBytes("UTF-8"));channel.send(sendBuffer, new InetSocketAddress("127.0.0.1", 1234));System.out.println("Send message to server end");// receiveByteBuffer receiveBuffer = ByteBuffer.allocate(80);SocketAddress remoteAddress = channel.receive(receiveBuffer);receiveBuffer.flip();String receivedString = Charset.forName("UTF-8").newDecoder().decode(receiveBuffer).toString();System.out.println("Receive message from " + remoteAddress.toString()+ " server: " + receivedString);}}