Java Socket 通信(同步阻塞式I/O)
来源:互联网 发布:帝国cms电影源码 编辑:程序博客网 时间:2024/06/08 06:58
java实现socket通信比较简单,因为它提供了ServerSocket 和Socket类。如下为一个简单的实例:TimeServer与TimeClient
1 TimeServer
public class TimeServer { public static void main(String[] args) throws IOException { int port = 8080;//server 端口采用8080 ServerSocket server = null; Socket socket = null; try { server = new ServerSocket(port); while(true){ socket = server.accept(); new Thread(new TimeHandler(socket)).start(); } } catch (Exception e) { e.printStackTrace(); }finally{ if(server!=null){ server.close(); server =null; System.out.println("the time server close..."); } } }}class TimeHandler implements Runnable{ private Socket socket; public TimeHandler(){ } public TimeHandler(Socket socket){ this(); this.socket = socket; } public void run() { System.out.println(Thread.currentThread().getName()+" start success..."); BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(),true); while(true){ String str = in.readLine(); if("end".equals(str)){ break; } String time = str+":"+System.currentTimeMillis(); out.println(time); } } catch (Exception e) { e.printStackTrace(); }finally{ if(in!=null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } in = null; } if(out!=null){ out.close(); out= null; } if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } socket =null; } } }}
TimeServer对每一个Socket连接建立一个Handler处理线程,处理线程对inputstream流中的数据进行相应的处理后,将处理结果通过PrintWriter发送给客户端,在最后需要关闭输入流、输出流和socket套接字句柄资源。
2 TimeClient
public class TimeClient { public static void main(String[] args) { int port = 8080; Socket socket = null; BufferedReader in =null; PrintWriter out =null; try { socket = new Socket("127.0.0.1", port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(),true); out.println("hello"); out.println("world"); out.println("end"); System.out.println("send message success..."); while(true){ String res = in.readLine(); if("".equals(res)||res==null){ break; } System.out.println("the res is:"+res); } } catch (Exception e) { e.printStackTrace(); }finally{ if(in!=null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } in = null; } if(out!=null){ out.close(); out= null; } if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } socket =null; } } }}
问题分析:同步阻塞式I/O的问题在于一个新的客户端请求接入时,服务端必须创建一个新的线程来处理接入的客户端,一个线程只能处理一个客户端,这种模型往往无法满足高性能、高并发的接入场景。
以上实例改编参考于《Netty权威指南(第2版)》
0 0
- Java Socket 通信(同步阻塞式I/O)
- java socket通信I/O阻塞>多线程实现非阻塞通信
- socket阻塞与非阻塞,同步与异步、I/O模型(c语言,java可以借鉴)
- 关于:socket阻塞、非阻塞,同步、异步、I/O模型
- 关于:socket阻塞、非阻塞,同步、异步、I/O模型
- 关于:socket阻塞、非阻塞,同步、异步、I/O模型
- socket阻塞、非阻塞,同步、异步、I/O模型
- (转)socket阻塞与非阻塞,同步与异步、I/O模型
- 同步阻塞式I/O模型
- 同步阻塞式I/O编程
- 同步阻塞通信-伪异步I/O编程
- Java I/O学习笔记(1),同步阻塞式IO
- Java NIO-I/O模型: 阻塞、非阻塞、I/O复用、同步、异步
- 同步异步阻塞非阻塞I/O
- I/O 阻塞&非阻塞&同步&异步
- socket阻塞与非阻塞,同步与异步、I/O模型
- socket阻塞与非阻塞,同步与异步、I/O模型
- socket阻塞与非阻塞,同步与异步、I/O模型
- 把Java程序打包成jar文件包并执行
- select, iocp, epoll,kqueue及各种I/O复用机制
- [51]1602液晶程序
- 南阳题目287-Radar
- GIT 常用命令大全及其说明
- Java Socket 通信(同步阻塞式I/O)
- iOS xib崩溃问题
- [51]12864液晶程序
- 八爪鱼采集器爬取京东手机信息
- 串口初始化
- Ubuntu 15.10安装ns2.35+nam
- .bar : 嵌入子元素
- shell if手册
- In App Purchase(应用内购)