诗特林-sterning
posts - 204, comments - 3566, trackbacks - 0, articles - 3
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
多线程Java Socket编程示例
Posted on 2007-10-15 12:37
诗特林
阅读(6769)
评论(7)
编辑
收藏
所属分类:
Socket
多线程Java Socket编程示例
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.
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();
}
}
}
;
}
}
从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子---
Java基于Socket文件传输示例
,就可以实现多线程文件的传输了
Feedback
#
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 java.net.ServerSocket;
import java.net.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 java.net.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
有猫相伴的日子
这个代码有很多问题,如请求处理,怎么封装请求对象,把请求对象放一队列
从服务器端怎么发消息到客户端.....
新闻频道
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2007-10-22 10:15 编辑过
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
Java开发的模拟聊天工具
Java socket编程中的日志处理
用Java实现FTP批量大文件上传下载(六)--代码及示例下载
用Java实现FTP批量大文件上传下载(五) --运行效果图
用Java实现FTP批量大文件上传下载(四)
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(二)
用Java实现FTP批量大文件上传下载(一)
多线程Java Socket编程示例
Java基于Socket文件传输示例
Powered by:
BlogJava
Copyright © 诗特林
日历
<
2007年10月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
随笔分类
.NET(4)
BI(12)
DesignPattern(3)
English(24)
J2EE(30)
Java(15)
JavaScript(7)
Java与外企(12)
JPA(2)
JSF(9)
Oracle(22)
PMP(6)
SAP(3)
Socket(10)
Spring(1)
Struts(12)
Swing(3)
Think In Java 4th(2)
生活随笔(19)
软件测试(1)
项目管理(5)
随笔档案
2008年7月 (6)
2008年6月 (22)
2008年5月 (4)
2008年4月 (13)
2008年3月 (3)
2008年2月 (1)
2008年1月 (26)
2007年12月 (20)
2007年11月 (11)
2007年10月 (35)
2007年9月 (30)
2007年8月 (15)
2007年7月 (7)
2007年5月 (1)
2006年8月 (4)
2006年7月 (8)
相册
书法
搜索
积分与排名
积分 - 272824
排名 - 19
最新评论
1. re: 用Java实现FTP批量大文件上传下载(五) --运行效果图
俺也要!现在也正要写这个程序,能否把完整的源码发给我呢???谢谢!!!邮箱:songshusong@gmail.com
--sasssoon
2. re: Java做的酒店管理系统(C/S)源码[未登录]
frankli@foxmail.com 麻烦发一个看看.谢谢楼主.
--七月
3. re: Thinking in Java 第四版(完全)及源代码
评论内容较长,点击标题查看
--习惯
4. re: 用Java实现FTP批量大文件上传下载(六)--代码及示例下载
站长,能不能也给我发一份.java源代码,感激不尽。
我的邮箱是:ws228wwj@163.com
--追梦狂鹰
5. re: Struts2+Spring2+Hibernate3 web应用示例------源代码
帮我发一份`:zhangqiaozhi@126.com
--mir.zhang
阅读排行榜
1. Struts2+Spring2+Hibernate3 web应用示例(一)(8571)
2. 多线程Java Socket编程示例(6769)
3. Java基于Socket文件传输示例(6480)
4. Visual Studio 2008和ASP.NET 3.5使用之初体验(5930)
5. Struts2+Spring2+Hibernate3 web应用示例------源代码(4615)
评论排行榜
1. Java做的酒店管理系统(C/S)源码(1110)
2. 系统分析师最新资料(536)
3. 基于WEB的批量大文件上传下载技术共享(含源代码)(517)
4. Thinking in Java 第四版(完全)及源代码(303)
5. 共享到底-软件设计师(高级程序员)资料(182)
60天内阅读排行
1. 李阳疯狂英语下载地址(点击可直接下载)(423)
2. Oracle:管理表空间(240)
3. oracle10G下在isqlplus中启用sys账户的解决办法(210)
4. 转载:学习Oracle动态性能表-(1)-V$SQLAREA(181)
5. 我对SAP培训的理解(转)(178)