JAVA并发处理经验(四)并行模式与算法6:socket的服务端多线程
来源:互联网 发布:mac电脑怎么压缩文件 编辑:程序博客网 时间:2024/05/19 18:15
一、前言
关于网络编程,这一章一般用NIO编程,但是我们得一步步,免得扯着蛋蛋。我们先温习一下,socket的服务器---客户端;我们适用服务端用线程池,线程池没有懂得小火炮,看以前的,或者直接问群里就ok。
二、socket服务端多线程
友情提示:可以用spring或者注解线程池,在实际运用的时候;
2.1 socket线程池实现客户端
package pattern.nio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by ycy on 16/1/18. */public class MultiThreadEchoserver { private static ExecutorService tp = Executors.newCachedThreadPool(); static class HandleMsg implements Runnable { Socket clientSocket; public HandleMsg(Socket clientSocket) { this.clientSocket = clientSocket; } public void run() { BufferedReader is = null; PrintWriter os = null; try { is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); os=new PrintWriter(clientSocket.getOutputStream(),true); //从inputstream 中读取客户端发送的数据 String inputString =null; long b = System.currentTimeMillis(); while ((inputString = is.readLine()) != null) { System.out.println("搜到客户端数据"+inputString); os.println(inputString+"--来自服务端"); } long e = System.currentTimeMillis(); System.out.println("spend:" + (e - b) + "ms"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { ServerSocket serverSocke = null; Socket clientSocket = null; try { serverSocke = new ServerSocket(65500); } catch (IOException e) { e.printStackTrace(); } while (true) { try { clientSocket = serverSocke.accept(); System.out.println(clientSocket.getRemoteSocketAddress() + " conect"); tp.execute(new HandleMsg(clientSocket)); } catch (IOException e) { e.printStackTrace(); } } }}
2.2 socke客户端
注意里面注解:巨坑package pattern.nio;import java.io.*;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;/** * Created by ycy on 16/1/18. */public class Client { public static void main(String[] args) throws IOException { Socket client=null; PrintWriter writer=null; BufferedReader reader=null; try { client=new Socket(); client.connect(new InetSocketAddress("127.0.0.1",65500)); writer=new PrintWriter(client.getOutputStream(),true); OutputStream os=client.getOutputStream(); String secondeString="这个是通过os传送得---"; os.write(secondeString.getBytes()); //巨坑:如果你服务端口用readline来读取,客户端用print 来写入数据,那么客户端就一直不能关闭.不信你试一试 writer.printf("hello"); writer.flush(); reader=new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("from serverL:"+reader.readLine()); }catch (UnknownHostException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); }finally { if (writer!=null){ writer.close(); } if (reader!=null){ reader.close(); } if (client!=null){ client.close(); } } }}
2.3 高io的客户端
package pattern.nio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.LockSupport;/** * Created by ycy on 16/1/19. * 这个适用LockSupport阻塞当前线程模拟 * io耗时的情况,服务器响应就慢了; * 在其他语言里面,所以不要这么用,这么用就显得逼格不高了.就像生产者-消费者一样,高逼格都是用队列服务器了 * */public class HeavySocketClient { private static ExecutorService tp = Executors.newCachedThreadPool(); private static final int sleep_time = 1000 * 1000 * 1000; public static class EchoClient implements Runnable { public void run() { Socket client = null; PrintWriter writer = null; BufferedReader reader = null; try { client = new Socket(); client.connect(new InetSocketAddress("127.0.0.1", 65500)); writer = new PrintWriter(client.getOutputStream(), true); writer.print("high client"); LockSupport.parkNanos(sleep_time); writer.print("end client1"); LockSupport.parkNanos(sleep_time); writer.print("end client2"); LockSupport.parkNanos(sleep_time); writer.print("end client3"); LockSupport.parkNanos(sleep_time); writer.print("end client4"); LockSupport.parkNanos(sleep_time); writer.print("end client5"); LockSupport.parkNanos(sleep_time); writer.print("end client6"); writer.println(); writer.flush(); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("from server:" + reader.readLine()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } if (reader != null) { reader.close(); } if (client != null) { client.close(); } } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { EchoClient ec=new EchoClient(); for (int i = 0; i <10 ; i++) { tp.submit(ec); } }}
三、预告
本身就不熟悉的socket服务,看起来还是不尽人意。你不熟悉,并不是因为你差,是因为这个市场需要这个少。呵呵。 那么未来解决io慢得情况,我们适用NIO编辑,这个才是网络编程的实用点哦
0 0
- JAVA并发处理经验(四)并行模式与算法6:socket的服务端多线程
- JAVA并发处理经验(四)并行模式与算法3:并行流水线模式
- JAVA并发处理经验(四)并行模式与算法4:并行搜索模式
- JAVA并发处理经验(四)并行模式与算法5:并行排序模式-奇偶性排序
- JAVA并发处理经验(四)并行模式与算法5:并行排序模式-希尔排序
- JAVA并发处理经验(四)并行模式与算法6:NIO网络编程
- JAVA并发处理经验(四)并行模式与算法1:生产者消费与单例模式
- JAVA并发处理经验(四)并行模式与算法2:Future模式
- JAVA并发处理经验(四)并行模式与算法7:AIO网络编程
- 《Java高并发程序设计》总结--5. 并行模式与算法
- Thrift框架服务端并发处理模式的java示例
- java socket 多线程的服务端与客户端的demo
- JAVA并发处理经验(一)多线程总结
- Java Socket 多线程编程,处理百万级的数据并发。
- Java多线程--并发和并行的区别
- Java多线程--并发和并行的区别
- JAVA并发处理经验(三)锁的优化与注意
- 服务端Socket多线程处理框架
- mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?
- port git代码下载后打包命令
- JMeter进行web测试详解
- 【HDU】 1026 Ignatius and the Princess I
- 二叉树创建-思路
- JAVA并发处理经验(四)并行模式与算法6:socket的服务端多线程
- 30分钟学会正则
- 当讨论分布式系统时,我们都会讨论些什么?
- cocos2d-x安卓调试 android.content.res.Resources$NotFoundException: String resource ID #0x0
- 自我学习之KMP算法
- iOS调用系统相册、相机 显示中文标题
- Windows消息机制要点
- Laravel Homestead 使用
- LeetCode 326 Power of Three(3的幂)(递归、Log函数)