多线程Java Socket编程示例

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

这篇做为学习孙卫琴<<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();
}

}


}
;
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值