多线程Java Socket编程示例
2011-04-29 10:56 myjava2 阅读(175) 评论(0) 收藏 举报这篇做为学习孙卫琴<<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();
}
}
}
;
}
}
浙公网安备 33010602011771号