多线程和Socket结合使用的例子

news/2024/7/5 2:35:52
多线程Java Socket编程示例

这篇做为学习孙卫琴<>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.

1.服务端

1. package sterning;
2.
3. import java.io.BufferedReader;
4. import java.io.IOException;
5. import java.io.InputStream;
6. import java.io.InputStreamReader;
7. import java.io.OutputStream;
8. import java.io.PrintWriter;
9. import java.net.*;
10. import java.util.concurrent.*;
11.
12. public class MultiThreadServer {
13. private int port=8821;
14. private ServerSocket serverSocket;
15. private ExecutorService executorService;//线程池
16. private final int POOL_SIZE=10;//单个CPU线程池大小
17.
18. public MultiThreadServer() throws IOException{
19. serverSocket=new ServerSocket(port);
20. //Runtime的availableProcessor()方法返回当前系统的CPU数目.
21. executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
22. System.out.println("服务器启动");
23. }
24.
25. public void service(){
26. while(true){
27. Socket socket=null;
28. try {
29. //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
30. socket=serverSocket.accept();
31. executorService.execute(new Handler(socket));
32.
33. } catch (Exception e) {
34. e.printStackTrace();
35. }
36. }
37. }
38.
39. public static void main(String[] args) throws IOException {
40. new MultiThreadServer().service();
41. }
42.
43. }
44.
45. class Handler implements Runnable{
46. private Socket socket;
47. public Handler(Socket socket){
48. this.socket=socket;
49. }
50. private PrintWriter getWriter(Socket socket) throws IOException{
51. OutputStream socketOut=socket.getOutputStream();
52. return new PrintWriter(socketOut,true);
53. }
54. private BufferedReader getReader(Socket socket) throws IOException{
55. InputStream socketIn=socket.getInputStream();
56. return new BufferedReader(new InputStreamReader(socketIn));
57. }
58. public String echo(String msg){
59. return "echo:"+msg;
60. }
61. public void run(){
62. try {
63. System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
64. BufferedReader br=getReader(socket);
65. PrintWriter pw=getWriter(socket);
66. String msg=null;
67. while((msg=br.readLine())!=null){
68. System.out.println(msg);
69. pw.println(echo(msg));
70. if(msg.equals("bye"))
71. break;
72. }
73. } catch (IOException e) {
74. e.printStackTrace();
75. }finally{
76. try {
77. if(socket!=null)
78. socket.close();
79. } catch (IOException e) {
80. e.printStackTrace();
81. }
82. }
83. }
84. }

2.客户端

1. package sterning;
2.
3. import java.io.BufferedReader;
4. import java.io.IOException;
5. import java.io.InputStreamReader;
6. import java.io.OutputStream;
7. import java.net.Socket;
8. import java.util.concurrent.ExecutorService;
9. import java.util.concurrent.Executors;
10.
11. public class MultiThreadClient {
12.
13. public static void main(String[] args) {
14. int numTasks = 10;
15.
16. ExecutorService exec = Executors.newCachedThreadPool();
17.
18. for (int i = 0; i < numTasks; i++) {
19. exec.execute(createTask(i));
20. }
21.
22. }
23.
24. // 定义一个简单的任务
25. private static Runnable createTask(final int taskID) {
26. return new Runnable() {
27. private Socket socket = null;
28. private int port=8821;
29.
30. public void run() {
31. System.out.println("Task " + taskID + ":start");
32. try {
33. socket = new Socket("localhost", port);
34. // 发送关闭命令
35. OutputStream socketOut = socket.getOutputStream();
36. socketOut.write("shutdown\r\n".getBytes());
37.
38. // 接收服务器的反馈
39. BufferedReader br = new BufferedReader(
40. new InputStreamReader(socket.getInputStream()));
41. String msg = null;
42. while ((msg = br.readLine()) != null)
43. System.out.println(msg);
44. } catch (IOException e) {
45. e.printStackTrace();
46. }
47. }
48.
49. };
50. }
51. }

http://www.niftyadmin.cn/n/3855215.html

相关文章

- 线程的同步

1. 线程同步是对不同线程的协调。 2. 线程之间的四种关系&#xff08;1&#xff09;不相关的线程。&#xff08;2&#xff09;相关但无需同步的线程。&#xff08;3&#xff09;互斥线程。&#xff08;4&#xff09;相互通信式互斥线程。 3. 不相关的线程。用以执行不同功能的线…

java:多线程与Socket结合的简单示例

java:多线程与Socket结合的简单示例import java.io.*; import java.net.*; public class MyServer {public static void main(String[] args) throws IOException {ServerSocket server new ServerSocket(5678);Socket client server.accept();BufferedReader in new Buffer…

cocos2d-x开发之sqlite数据库加密研究(sqlite3.c代码浅析1)

SQLITE版本3.7.15.1中的sqlite3.c长达13万多行&#xff0c;要细致分析这个文件可不容易。但是&#xff0c;这个文件是由许多个.H和.C文件组合而成&#xff0c;正如此文件开始的注释中所述&#xff1a;/**********************************************************************…

Openstack(两控制节点+四计算节点)-4 模拟控制节点宕机

为什么80%的码农都做不了架构师&#xff1f;>>> 双控制节点通过heartbeatpacemaker监控相关服务&#xff0c;所以须在两台控制节点上先安装heartbeat软件&#xff0c;安装过程可参照&#xff1a; http://my.oschina.net/guol/blog/90128 pacemaker主要是对控制节点…

行业网站优化一般步骤

关于行业网站优化我写的只是 SEO 的操作细则并非运营思路&#xff0c;运营思路将在后期引入&#xff0c; 这个行业网站优化细则我花几天的时间进行梳理结构和整理&#xff0c; 希望大家提意见&#xff0c; 同时谢谢长 期支持本站的 SEOer。 行业站的优势在于其海量的信息&#…

java Socket多线程服务器源代码介绍

java Socket多线程服务器源代码介绍java Socket多线程在我们进行相关学习的时候需要注意不断出现的问题&#xff0c;下面我们就来看看在java Socket多线程中服务器的代码编写。java Socket多线程需要我们不断的学习&#xff0c;在学习的时候我们就会发现在服务器的配置上有不少…

Java Socket 编程——多线程网络聊天程序

Java Socket 编程——多线程网络聊天程序 首先&#xff0c;进行服务端的编程&#xff0c;作为服务端&#xff0c;编程主要按下面几个步骤进行&#xff1a;// 1. 创建socketServerSocket ss new ServerSocket(PortNumber);Socket s ss.accept(); //监听器&#xff0c;产生阻塞…

SQL Server 跨服务器 不同数据库之间复制表的数据的方法:

不同数据库之间复制表的数据的方法&#xff1a; 当表目标表存在时&#xff1a; insert into 目的数据库..表 select * from 源数据库..表 当目标表不存在时&#xff1a; select * into 目的数据库..表 from 源数据库..表 --如果在不同的SQL之间: insert into openrowset(sql…