




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多线程Java Socket编程示例这篇做为学习孙卫琴的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.1.服务端packagesterning;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintWriter;.*;importjava.util.concurrent.*;publicclassMultiThreadServerprivateintport=8821;privateServerSocketserverSocket;privateExecutorServiceexecutorService;/线程池privatefinalintPOOL_SIZE=10;/单个CPU线程池大小publicMultiThreadServer()throwsIOExceptionserverSocket=newServerSocket(port);/Runtime的availableProcessor()方法返回当前系统的CPU数目.executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);System.out.println(服务器启动);publicvoidservice()while(true)Socketsocket=null;try/接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接socket=serverSocket.accept();executorService.execute(newHandler(socket);catch(Exceptione)e.printStackTrace();publicstaticvoidmain(Stringargs)throwsIOExceptionnewMultiThreadServer().service();classHandlerimplementsRunnableprivateSocketsocket;publicHandler(Socketsocket)this.socket=socket;privatePrintWritergetWriter(Socketsocket)throwsIOExceptionOutputStreamsocketOut=socket.getOutputStream();returnnewPrintWriter(socketOut,true);privateBufferedReadergetReader(Socketsocket)throwsIOExceptionInputStreamsocketIn=socket.getInputStream();returnnewBufferedReader(newInputStreamReader(socketIn);publicStringecho(Stringmsg)returnecho:+msg;publicvoidrun()trySystem.out.println(Newconnectionaccepted+socket.getInetAddress()+:+socket.getPort();BufferedReaderbr=getReader(socket);PrintWriterpw=getWriter(socket);Stringmsg=null;while(msg=br.readLine()!=null)System.out.println(msg);pw.println(echo(msg);if(msg.equals(bye)break;catch(IOExceptione)e.printStackTrace();finallytryif(socket!=null)socket.close();catch(IOExceptione)e.printStackTrace();2.客户端packagesterning;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStream;.Socket;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassMultiThreadClientpublicstaticvoidmain(Stringargs)intnumTasks=10;ExecutorServiceexec=Executors.newCachedThreadPool();for(inti=0;inumTasks;i+)exec.execute(createTask(i);/定义一个简单的任务privatestaticRunnablecreateTask(finalinttaskID)returnnewRunnable()privateSocketsocket=null;privateintport=8821;publicvoidrun()System.out.println(Task+taskID+:start);trysocket=newSocket(localhost,port);/发送关闭命令OutputStreamsocketOut=socket.getOutputStream();socketOut.write(shutdownrn.getBytes();/接收服务器的反馈BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream();Stringmsg=null;while(msg=br.readLine()!=null)System.out.println(msg);catch(IOExceptione)e.printStackTrace();从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子-Java基于Socket文件传输示例,就可以实现多线程文件的传输了 评论#re: 多线程Java Socket编程示例回复更多评论 2007-11-10 14:25 by xiongzeng 请问作者: 可不可以利用服务端主动发信?#re: 多线程Java Socket编程示例回复更多评论 2007-12-07 13:12 by qifen 膏药帖#re: 多线程Java Socket编程示例回复更多评论 2008-01-07 22:19 by java综合网 很好!不错!#re: 多线程Java Socket编程示例回复更多评论 2008-03-14 11:36 by fgfdg dgdfggfdgdf#re: 多线程Java Socket编程示例回复更多评论 2008-05-28 17:14 by 钟侥 我也是参照孙的书,可是运行不能得到正确的结果!很是郁闷啊 code package com.zz.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import .ServerSocket; import .Socket; public class EchoServer private int port = 8000; private ServerSocket ss; public EchoServer() throws IOException ss = new ServerSocket(port); System.out.println(server is starting.); private String echoString(String msg) return echo: + msg; public static void main(String args) try new EchoServer().service(); catch (IOException e) e.printStackTrace(); private void service() while(true) Socket s = null; try s = ss.accept(); System.out.println(a client is coming.); BufferedReader br = this.getReader(s); PrintWriter pw = this.getWriter(s); String msg = null; while(msg = br.readLine() != null) System.out.println(msg); pw.println(this.echoString(msg)+n); pw.flush(); if(msg.equals(bye) break; catch(IOException e ) private PrintWriter getWriter(Socket s) throws IOException return new PrintWriter(s.getOutputStream(); private BufferedReader getReader(Socket s) throws IOException return new BufferedReader(new InputStreamReader(s.getInputStream(); /code#re: 多线程Java Socket编程示例回复更多评论 2008-05-28 17:15 by 钟侥 package com.zz.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import .Socket; public class EchoClient private String host = localhost; private int port = 8000; private Socket socket; private EchoClient() throws IOException socket = new Socket(host, port); public void talk() throws IOException try BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); BufferedReader localReader = new BufferedReader( new InputStreamReader(System.in); String msg = null; while (msg = localReader.readLine()!= null) pw.println(msg+n); pw.flush(); System.out.println(br.readLine(); if (msg.equals(bye) break; catch (IOException e) finally try socket.close(); catch (IOException e) e.printStackTrace(); private PrintWriter getWriter(Socket s) throws IOException return new PrintWriter(s.getOutputStream(); private BufferedReader getReader(Socket s) throws IOException return new BufferedReader(new InputStreamReader(s.getInputStream(); /* * param args * throws IOException */ public static void main(String args) throws IOException new EchoClient().talk(); #re: 多线程Java Socket编程示例回复更多评论 2008-06-16 23:04 by 有猫相伴的日子 这个代码有很多问题,如请求处理,怎么封装请求对象,把请求对象放一队列 从服务器端怎么发消息到客户端. #re: 多线程Java Socket编程示例回复更多评论 2009-04-27 10:22 by fei 貌似整体思想可以,但是,程序的问题就比较多了.#re: 多线程Java Socket编程示例未登录回复更多评论 2009-05-07 15:38 by jh 第三方杀毒#re: 多线程Java Socket编程示例回复更多评论 2009-05-07 17:14 by OverKill 如果多个线程对同一资源进行读取,能保证资源的原子性吗?应该对资源加锁#re: 多线程Java Socket编程示例回复更多评论 2009-05-17 15:52 by 点水点点 正找这样的文章 多谢#re: 多线程Java Socket编程示例未登录回复更多评论 2009-08-23 19:12 by Mark 如何设定超时的问题呢?#re: 多线程Java Socket编程示例回复更多评论 2010-05-09 13:48 by 诗特林fans 我是java网络编程的初学者很想加 诗特林 为好友向你请教些问题。我的qq826463574#re: 多线程Java Socket编程示例回复更多评论 2010-05-09 14:05 by 诗特林fans 服务器端: public class MultiThreadServer private int port=8821; private ServerSocket serverSocket; private ExecutorService executorService;/线程池 private final int POOL_SIZE=10;/单个CPU线程池大小 public MultiThreadServer() throws IOException serverSocket=new ServerSocket(port); /Runtime的availableProcessor()方法返回当前系统的CPU数目. executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); System.out.println(服务器启动); public void service() while(true) Socket socket=null; try /接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接 socket=serverSocket.accept(); executorService.execute(new Handler(socket); catch (Exception e) e.printStackTrace(); public static void main(String args) throws IOException new MultiThreadServer().service(); class Handler implements Runnable private Socket socket; public Handler(Socket socket) this.socket=socket; /*private DataOutputStream dos(Socket socket) throws IOException OutputStream socketOut=socket.getOutputStream(); return new DataOutputStream(socketOut); private DataInputStream dis(Socket socket) throws IOException InputStream socketIn=socket.getInputStream(); return new DataInputStream(socketIn); */ public void run() try System.out.println(New connection accepted +socket.getInetAddress()+:+socket.getPort(); OutputStream os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); InputStream is = socket.getInputStream( ); DataInputStream dis=new DataInputStream(is); new myserverread(dis).start(); new myserverwite(dos).start(); catch (IOException e) e.printStackTrace(); /*finally try if(socket!=null) socket.close(); catch (IOException e) e.printStackTrace(); */ class myserverread extends Thread private DataInputStream dis; public myserverread (DataInputStream dis) this.dis=dis; public void run() String info; try while(true) info=dis.readUTF(); System.out.println(对方说+info); if (info.equals(bye) System.out.println(对方下线,程序退出); System.exit(0); catch (Exception e)e.getStackTrace(); class myserverwite extends Thread private DataOutputStream dos; public myserverwite (DataOutputStream dos) this.dos=dos; public void run() BufferedReader br=new BufferedReader(new InputStreamReader(System.in); String info; try while(true) info=br.readLine(); dos.writeUTF(info); if (info.equals(bye) System.out.println(自己下线,程序退出); System.exit(0); catch (Exception e)e.getStackTrace(); #re: 多线程Java Socket编程示例回复更多评论 2010-05-09 14:06 by 诗特林fans 客户端: import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import .Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadClient public static void main(String args) int ID=Info.i; ExecutorService exec = Executors.newCachedThreadPool(); /* for (int i = 0; i numTasks; i+) exec.execute(createTask(i); */ System.out.println(客户端线程+ID+已启动); exec.execute(createTask(ID); Info.i=ID+; / 定义一个简单的任务 private static Runnable createTask(int taskID) / this.taskID=taskID; return new Runnable() private Socket socket = null; private int port=8821; public void run() / System.out.println(Task + taskID + :start); try socket = new Socket(localhost, port); / 发送关
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一活动编花篮活动方案
- 六一活动跳舞蹈活动方案
- 六一演出带队活动方案
- 六一童心企划活动方案
- 六一美餐活动方案
- 六一节活动签到活动方案
- 六堡镇植树活动方案
- 六年级组织植树活动方案
- 医护礼仪考试试题及答案
- 冶金教资考试试题及答案
- 2025-2030中国医疗美容行业市场深度调研及竞争格局与投资研究报告
- 安徽省合肥市蜀山区2025年数学五下期末监测试题含答案
- 《基于CREAM方法对某核电站调试阶段人因失误原因分析案例报告》17000字【论文】
- 2025年宿迁中考试题及答案英语
- 2025年麻精药品考试试题及答案
- DBJ51T062-2016 四川省旋挖孔灌注桩基技术规程
- DB11-T 420-2019 电梯安装、改造、重大修理和维护保养自检规则
- 湖南省长沙五中学2025届中考生物适应性模拟试题含解析
- 《银行个人理财业务PEST探析和SWOT探析》4000字
- 从细节开始为家人制定科学合理的膳食计划
- 医院医用耗材SPD服务项目投标方案
评论
0/150
提交评论