首页 > 代码库 > DatagramChannel 举例
DatagramChannel 举例
Server 端:
package datagram;import java.io.IOException;import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.DatagramChannel;import java.nio.charset.Charset;public class UDPServer { private int port = 8008; private DatagramChannel channel; private int MAX_SIZE = 1024; public UDPServer(int port, int size) throws IOException { this.port = port; this.MAX_SIZE = size; channel = DatagramChannel.open(); SocketAddress localAddr = new InetSocketAddress(this.port); channel.bind(localAddr); System.out.println("Server Starting..."); } public UDPServer() throws IOException { this(8008, 1024); } public String echo(String msg) { return "echo:" + msg; } public void service() { ByteBuffer receiveBuffer = ByteBuffer.allocate(MAX_SIZE); while(true) { try { receiveBuffer.clear(); InetSocketAddress client = (InetSocketAddress) channel.receive(receiveBuffer); receiveBuffer.flip(); String msg = Charset.forName("GBK").decode(receiveBuffer).toString(); System.out.println(client.getAddress().getHostAddress() + ":" + client.getPort() + " > " + msg); channel.send(ByteBuffer.wrap(echo(msg).getBytes()), client); if(msg.startsWith("bye")) break; } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { new UDPServer().service(); }}
Client 端:
package datagram;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.channels.DatagramChannel;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.charset.Charset;import java.util.Iterator;import java.util.Set;public class UDPClient { private DatagramChannel datagramChannel = null; private ByteBuffer sendBuffer = ByteBuffer.allocate(1024); private ByteBuffer receiveBuffer = ByteBuffer.allocate(1024); private Charset charset = Charset.forName("GBK"); private Selector selector; public UDPClient(int port) throws IOException { datagramChannel = DatagramChannel.open(); InetAddress ia = InetAddress.getByName("10.11.3.220"); InetSocketAddress isa = new InetSocketAddress(ia, port); datagramChannel.configureBlocking(false); datagramChannel.bind(isa); ia = InetAddress.getByName("10.11.3.160"); isa = new InetSocketAddress(ia, 8008); datagramChannel.connect(isa); selector = Selector.open(); } public UDPClient() throws IOException { this(7000); } public static void main(String[] args) throws IOException { int port = 7000; if(args.length > 0) port = Integer.parseInt(args[0]); final UDPClient client = new UDPClient(port); Thread receiver = new Thread() { public void run() { client.receiveFromUser(); } }; receiver.start(); client.talk(); } public void receiveFromUser() { try { BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String msg = null; while((msg = localReader.readLine()) != null) { synchronized(sendBuffer) { sendBuffer.put(encode(msg + "\r\n")); } if(msg.equals("bye")) break; } } catch (IOException e) { e.printStackTrace(); } } public void talk() throws IOException { datagramChannel.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE); while(selector.select() > 0) { Set<SelectionKey> readyKeys = selector.selectedKeys(); Iterator<SelectionKey> it = readyKeys.iterator(); while(it.hasNext()) { SelectionKey key = null; try { key = it.next(); it.remove(); if(key.isReadable()) { receive(key); } if(key.isWritable()) { send(key); } } catch (IOException e) { e.printStackTrace(); try { if(key != null) { key.cancel(); key.channel().close(); } } catch(Exception ex) { ex.printStackTrace(); } } } } } public void send(SelectionKey key) throws IOException { DatagramChannel datagramChannel = (DatagramChannel) key.channel(); synchronized(sendBuffer) { sendBuffer.flip(); datagramChannel.write(sendBuffer); sendBuffer.compact(); } } public void receive(SelectionKey key) throws IOException { DatagramChannel datagramChannel = (DatagramChannel) key.channel(); datagramChannel.read(receiveBuffer); receiveBuffer.flip(); String receiveData = decode(receiveBuffer); if(receiveData.indexOf("\n") == -1) return; String outputData = receiveData.substring(0, receiveData.indexOf("\n")+1); System.out.println(outputData); if(outputData.equals("echo:bye\r\n")) { key.cancel(); datagramChannel.close(); System.out.println("Closed connection with Server"); selector.close(); System.exit(0); } ByteBuffer temp = encode(outputData); receiveBuffer.position(temp.limit()); receiveBuffer.compact(); } public String decode(ByteBuffer buffer) { CharBuffer charBuffer = charset.decode(buffer); return charBuffer.toString(); } public ByteBuffer encode(String str) { return charset.encode(str); }}
DatagramChannel 举例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。