JAVA Socket编程学习6--NIOTCP两个线程监听两个端口
来源:互联网 发布:linux显示当前目录 编辑:程序博客网 时间:2024/06/05 10:11
本文代码来自:http://bbs.csdn.net/topics/390748964
客户端代码:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.util.Date;import java.util.Set; public class NIOClient implements Runnable{ private ByteBuffer sBuffer = ByteBuffer.allocate(1024); private ByteBuffer rBuffer = ByteBuffer.allocate(1024); private InetSocketAddress SERVER; private Selector selector; private SocketChannel client; private String receiveText; private String sendText; private int count=0; public NIOClient(int port){ SERVER = new InetSocketAddress("localhost", port); init(); } public void init(){ try { SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); selector = Selector.open(); socketChannel.register(selector, SelectionKey.OP_CONNECT); socketChannel.connect(SERVER); } catch (Exception e) { e.printStackTrace(); } } private void handle(SelectionKey selectionKey) throws IOException{ if (selectionKey.isConnectable()) { client = (SocketChannel) selectionKey.channel(); if (client.isConnectionPending()) { client.finishConnect(); System.out.println("connect success !"); sBuffer.clear(); sBuffer.put((new Date().toLocaleString()+" connected!").getBytes()); sBuffer.flip(); client.write(sBuffer); new Thread(){ @Override public void run() { while(true){ try { sBuffer.clear(); InputStreamReader input = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(input); sendText = br.readLine(); sBuffer.put(sendText.getBytes()); sBuffer.flip(); client.write(sBuffer); } catch (IOException e) { e.printStackTrace(); break; } } }; }.start(); } client.register(selector, SelectionKey.OP_READ); } else if (selectionKey.isReadable()) { client = (SocketChannel) selectionKey.channel(); rBuffer.clear(); count=client.read(rBuffer); if(count>0){ receiveText = new String( rBuffer.array(),0,count); System.out.println(receiveText); client = (SocketChannel) selectionKey.channel(); client.register(selector, SelectionKey.OP_READ); } } } @Override public void run() { // TODO Auto-generated method stub try { while (true) { selector.select(); Set<SelectionKey> keySet = selector.selectedKeys(); for(final SelectionKey key : keySet){ handle(key); }; keySet.clear(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String args[]){ NIOClient client1 = new NIOClient(7788); new Thread(client1).start(); }}服务端代码:
import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;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.charset.Charset;import java.util.HashMap;import java.util.Map;import java.util.Set; public class NIOSServer implements Runnable{ private int port = 8888; private Charset cs = Charset.forName("gbk"); private ByteBuffer sBuffer = ByteBuffer.allocate(1024); private ByteBuffer rBuffer = ByteBuffer.allocate(1024); private Map<String, SocketChannel> clientsMap = new HashMap<String, SocketChannel>(); private Selector selector; public NIOSServer(int port){ this.port = port; try { init(); } catch (Exception e) { e.printStackTrace(); } } private void init() throws IOException{ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); ServerSocket serverSocket = serverSocketChannel.socket(); serverSocket.bind(new InetSocketAddress(port)); selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println("server start on port:"+port); } private void listen(){ } @Override public void run() { // TODO Auto-generated method stub while (true) { try { selector.select(); Set<SelectionKey> selectionKeys = selector.selectedKeys(); for(SelectionKey key : selectionKeys){ handle(key); } selectionKeys.clear(); } catch (Exception e) { e.printStackTrace(); break; } } } private void handle(SelectionKey selectionKey) throws IOException, InterruptedException { ServerSocketChannel server = null; SocketChannel client = null; String receiveText=null; int count=0; if (selectionKey.isAcceptable()) { server = (ServerSocketChannel) selectionKey.channel(); client = server.accept(); //判断client 是否为空 if(client != null){ client.configureBlocking(false); client.register(selector, SelectionKey.OP_READ); }// Thread.sleep(10*1000); } else if (selectionKey.isReadable()) { client = (SocketChannel) selectionKey.channel(); rBuffer.clear(); count = client.read(rBuffer); if (count > 0) { rBuffer.flip(); receiveText = String.valueOf(cs.decode(rBuffer).array()); System.out.println(client.toString()+":"+receiveText); dispatch(client, receiveText); client = (SocketChannel) selectionKey.channel(); client.register(selector, SelectionKey.OP_READ); } } } private void dispatch(SocketChannel client,String info) throws IOException{ Socket s = client.socket(); String name = "["+s.getInetAddress().toString().substring(1)+":"+Integer.toHexString(client.hashCode())+"]"; if(!clientsMap.isEmpty()){ for(Map.Entry<String, SocketChannel> entry : clientsMap.entrySet()){ SocketChannel temp = entry.getValue(); if(!client.equals(temp)){ sBuffer.clear(); sBuffer.put((name+":"+info).getBytes()); sBuffer.flip(); temp.write(sBuffer); } } } clientsMap.put(name, client); } public static void main(String[] args) throws InterruptedException { //创建NIOSServer NIOSServer server1 = new NIOSServer(7778); NIOSServer server2 = new NIOSServer(7777); new Thread(server1).start(); new Thread(server2).start();// Thread.sleep(10*1000); //创建NIOClient NIOClient client1 = new NIOClient(7778); new Thread(client1).start(); NIOClient client2 = new NIOClient(7777); new Thread(client2).start(); NIOClient client3 = new NIOClient(7778); new Thread(client3).start(); NIOClient client4 = new NIOClient(7777); new Thread(client4).start(); }}运行NIOSServer,输出:
server start on port:7778
server start on port:7777
connect success !
connect success !
connect success !
connect success !
java.nio.channels.SocketChannel[connected local=/127.0.0.1:7778 remote=/127.0.0.1:51700]:2017-11-7 15:46:06 connected!
java.nio.channels.SocketChannel[connected local=/127.0.0.1:7777 remote=/127.0.0.1:51709]:2017-11-7 15:46:06 connected!
java.nio.channels.SocketChannel[connected local=/127.0.0.1:7778 remote=/127.0.0.1:51706]:2017-11-7 15:46:06 connected!
java.nio.channels.SocketChannel[connected local=/127.0.0.1:7777 remote=/127.0.0.1:51703]:2017-11-7 15:46:06 connected!
[127.0.0.1:228079cf]:2017-11-7 15:46:06 connected!
[127.0.0.1:7c721de]:2017-11-7 15:46:06 connected!
阅读全文
0 0
- JAVA Socket编程学习6--NIOTCP两个线程监听两个端口
- apache同时监听两个端口
- JAVA 线程编程 ----两个线程程序
- 让apache同时监听两个端口
- QTcpServer如何监听两个不同的端口
- 【编程语言-Java】Java创建线程的两个方法
- 初学Nginx(一)监听两个端口,实现转发
- java线程的两个实现
- java两个线程交替执行
- JAVA Socket 编程的两个问题,readline(),判断Socket连接断掉
- socket编程服务器监听绑定端口被占用解决方法
- 两个进程,或者多个进程同时监听一个端口,邦定同一个端口,
- Netty学习之一--Java socket编程(单线程+多线程)
- java socket 编程 服务器一直监听
- java socket编程---单线程
- Tomcat配置两个端口
- RMI 两个端口
- RMI 两个端口
- 2017阿里云双11-云服务器ECS优惠活动最强解读和购买指南
- CSDN-markdown编辑器模板
- java 网络 TCP客户端 发送数据 Socket
- jQuery过滤、遍历同级元素、向上遍历、向下遍历
- python编程之判断一字符串是不是对称的,如:abcddcba
- JAVA Socket编程学习6--NIOTCP两个线程监听两个端口
- mybatis高级映射
- java 网络 TCP服务端接收数据 SeverSocket
- HDU 5929 Basic Data Structure(双端队列)
- UE4流关卡与无缝地图切换总结
- 报错解决问题
- 51talk-2 You look young
- javabean实体类对象转为Map类型对象的方法
- PHP函数闭包