zoukankan
html css js c++ java
【z】多线程Java Socket编程示例
1.服务端
package
sterning;
import
java.io.BufferedReader;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.OutputStream;
import
java.io.PrintWriter;
import
java.net.
*
;
import
java.util.concurrent.
*
;
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
PrintWriter getWriter(Socket socket)
throws
IOException
{
OutputStream socketOut
=
socket.getOutputStream();
return
new
PrintWriter(socketOut,
true
);
}
private
BufferedReader getReader(Socket socket)
throws
IOException
{
InputStream socketIn
=
socket.getInputStream();
return
new
BufferedReader(
new
InputStreamReader(socketIn));
}
public
String echo(String msg)
{
return
"
echo:
"
+
msg;
}
public
void
run()
{
try
{
System.out.println(
"
New connection accepted
"
+
socket.getInetAddress()
+
"
:
"
+
socket.getPort());
BufferedReader br
=
getReader(socket);
PrintWriter pw
=
getWriter(socket);
String msg
=
null
;
while
((msg
=
br.readLine())
!=
null
)
{
System.out.println(msg);
pw.println(echo(msg));
if
(msg.equals(
"
bye
"
))
break
;
}
}
catch
(IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if
(socket
!=
null
)
socket.close();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
}
}
2.客户端
package
sterning;
import
java.io.BufferedReader;
import
java.io.IOException;
import
java.io.InputStreamReader;
import
java.io.OutputStream;
import
java.net.Socket;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
public
class
MultiThreadClient
{
public
static
void
main(String[] args)
{
int
numTasks
=
10
;
ExecutorService exec
=
Executors.newCachedThreadPool();
for
(
int
i
=
0
; i
<
numTasks; i
++
)
{
exec.execute(createTask(i));
}
}
//
定义一个简单的任务
private
static
Runnable createTask(
final
int
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);
//
发送关闭命令
OutputStream socketOut
=
socket.getOutputStream();
socketOut.write(
"
shutdown\r\n
"
.getBytes());
//
接收服务器的反馈
BufferedReader br
=
new
BufferedReader(
new
InputStreamReader(socket.getInputStream()));
String msg
=
null
;
while
((msg
=
br.readLine())
!=
null
)
System.out.println(msg);
}
catch
(IOException e)
{
e.printStackTrace();
}
}
}
;
}
}
origin:
http://www.blogjava.net/sterning/archive/2007/10/15/152940.html
查看全文
相关阅读:
Flowable学习笔记(二、BPMN 2.0-基础 )
Flowable学习笔记(一、入门)
只有程序员才懂的幽默
Navicat自动备份数据库
两个原因导致Spring @Autowired注入的组件为空
设计模式—— 十二 :代理模式
设计模式—— 十 一:建造者模式
SpringBoot学习笔记(十一:使用MongoDB存储文件 )
Swagger API文档集中化注册管理
Spring Boot2从入门到实战:集成AOPLog来记录接口访问日志
原文地址:https://www.cnblogs.com/pony/p/1538642.html
最新文章
scala练习题1 基础知识
丰巢面试小结
monggodb学习系列:1,mongodb入门
关于团队3次内部沟通的思考
跨域的简单研究
阅读微信支付demo收获
python学习笔记1:python入门
php:ci学习笔记1
stm32寄存器版学习笔记02 串口通信
stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)
热门文章
十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)
数据结构学习笔记07散列查找(哈希表)
10-排序5 PAT Judge
10-排序4 统计工龄
数据结构学习笔记06排序 (快速排序、表排序、基数排序)
STL之迭代器
09-排序3 Insertion or Heap Sort
09-排序2 Insert or Merge
Jackson用法详解
设计模式—— 十三 :原型模式
Copyright © 2011-2022 走看看