Java Socket 通信(同步阻塞式I/O)
2016-04-06 18:23
465 查看
java实现socket通信比较简单,因为它提供了ServerSocket 和Socket类。如下为一个简单的实例:TimeServer与TimeClient
TimeServer对每一个Socket连接建立一个Handler处理线程,处理线程对inputstream流中的数据进行相应的处理后,将处理结果通过PrintWriter发送给客户端,在最后需要关闭输入流、输出流和socket套接字句柄资源。
问题分析:同步阻塞式I/O的问题在于一个新的客户端请求接入时,服务端必须创建一个新的线程来处理接入的客户端,一个线程只能处理一个客户端,这种模型往往无法满足高性能、高并发的接入场景。
以上实例改编参考于《Netty权威指南(第2版)》
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版)》
相关文章推荐
- Java之趣味编程结婚问题
- Struts2 Action访问Servlet API
- springMVC环境搭建
- java 富文本编辑内容去除格式 正则表达式
- java中&和&&的区别和联系
- 整理Java的MyBatis框架中一些重要的功能及基本使用示例
- Java之绘制实例
- Spring boot MVC: can't find JSP
- java修饰符
- JAVA日志
- 将studio中的library引进eclipse里
- java.io.FileNotFoundException: URL [jndi:/localhost/myBlogSys/WEB-INF/classes/] cannot be resolved t
- 使用 Spring 进行单元测试
- 把Java程序打包成jar文件包并执行
- Spring几大注解类的详解与区别
- [JAVA修炼之路六]-JVM 垃圾回收机制(算法)
- kafka java producer consumer实践
- RxJava学习第一天
- 约瑟夫环算法java
- XStream 解析xml 转 javaBean 问题