这篇做为学习孙卫琴<<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
ServerSocketserverSocket;
private
ExecutorServiceexecutorService;
//
线程池
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
)
{
Socketsocket
=
null
;
try
{
//
接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket
=
serverSocket.accept();
executorService.execute(
new
Handler(socket));
}
catch
(Exceptione)
{
e.printStackTrace();
}
}
}

public
static
void
main(String[]args)
throws
IOException
{
new
MultiThreadServer().service();
}

}

class
Handler
implements
Runnable
{
private
Socketsocket;
public
Handler(Socketsocket)
{
this
.socket
=
socket;
}
private
PrintWritergetWriter(Socketsocket)
throws
IOException
{
OutputStreamsocketOut
=
socket.getOutputStream();
return
new
PrintWriter(socketOut,
true
);
}
private
BufferedReadergetReader(Socketsocket)
throws
IOException
{
InputStreamsocketIn
=
socket.getInputStream();
return
new
BufferedReader(
new
InputStreamReader(socketIn));
}
public
Stringecho(Stringmsg)
{
return
"
echo:
"
+
msg;
}
public
void
run()
{
try
{
System.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();
}
finally
{
try
{
if
(socket
!=
null
)
socket.close();
}
catch
(IOExceptione)
{
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
;
ExecutorServiceexec
=
Executors.newCachedThreadPool();
for
(
int
i
=
0
;i
<
numTasks;i
++
)
{
exec.execute(createTask(i));
}

}

//
定义一个简单的任务
private
static
RunnablecreateTask(
final
int
taskID)
{
return
new
Runnable()
{
private
Socketsocket
=
null
;
private
int
port
=
8821
;
public
void
run()
{
System.out.println(
"
Task
"
+
taskID
+
"
:start
"
);
try
{
socket
=
new
Socket(
"
localhost
"
,port);
//
发送关闭命令
OutputStreamsocketOut
=
socket.getOutputStream();
socketOut.write(
"
shutdown/r/n
"
.getBytes());
//
接收服务器的反馈
BufferedReaderbr
=
new
BufferedReader(
new
InputStreamReader(socket.getInputStream()));
Stringmsg
=
null
;
while
((msg
=
br.readLine())
!=
null
)
System.out.println(msg);
}
catch
(IOExceptione)
{
e.printStackTrace();
}
}

}
;
}
}
本文通过Java实现了一个多线程服务器和客户端的应用案例,利用ExecutorService创建线程池来处理多个客户端连接请求。服务端使用固定大小的线程池接收客户端消息并响应,客户端则模拟多个任务并发向服务器发送请求。
1164

被折叠的 条评论
为什么被折叠?



