JAVA多线程Socket实现
代码简单实现客户询问10086客户个人账户套餐信息demo。代码主要分为客户端Client和服务端MultiThreadServer两个.java类。
服务端代码:
package cn.thread.socket;
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.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadServer {
private static final int PORT = 10086;//协议端口
private ServerSocket serverSocket;//服务端ServerSocket
private ExecutorService executorService;
private final int POOL_SIZE = 10;//线程池数量
public MultiThreadServer() throws IOException {
serverSocket = new ServerSocket(PORT);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("服务已启动");
}
public void service() {
while (true) {
Socket socket = null;
try {
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 {
public static final String CHARCODE = "utf-8";
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 void run() {
BufferedReader br = null;
PrintWriter out = null;
try {
br = getReader(socket);
out = getWriter(socket);
String msg = null;
String res = null;//回馈用户语
while ((msg = br.readLine()) != null) {
switch (Integer.parseInt(msg)) {
case 1:
System.out.println("10086客服接收到用户咨询:" + msg);
res = "客户您的套餐是每月38元包含420分钟";
break;
case 2:
System.out.println("10086客服接收到用户咨询:"+msg);
res = "客户您的套餐是最优惠的暂时不能更换";
break;
case 3:
System.out.println("10086客服接收到用户咨询:"+msg);
res = "再见";
break;
default:
System.out.println("10086客服接收到用户咨询:"+msg);
res = "您好请问有什么需要帮助?";
break;
}
System.out.println("10086客户发出回复:"+res);
out.println(res);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (out != null) {
out.close();
}
}
}
}
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.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadServer {
private static final int PORT = 10086;//协议端口
private ServerSocket serverSocket;//服务端ServerSocket
private ExecutorService executorService;
private final int POOL_SIZE = 10;//线程池数量
public MultiThreadServer() throws IOException {
serverSocket = new ServerSocket(PORT);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("服务已启动");
}
public void service() {
while (true) {
Socket socket = null;
try {
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 {
public static final String CHARCODE = "utf-8";
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 void run() {
BufferedReader br = null;
PrintWriter out = null;
try {
br = getReader(socket);
out = getWriter(socket);
String msg = null;
String res = null;//回馈用户语
while ((msg = br.readLine()) != null) {
switch (Integer.parseInt(msg)) {
case 1:
System.out.println("10086客服接收到用户咨询:" + msg);
res = "客户您的套餐是每月38元包含420分钟";
break;
case 2:
System.out.println("10086客服接收到用户咨询:"+msg);
res = "客户您的套餐是最优惠的暂时不能更换";
break;
case 3:
System.out.println("10086客服接收到用户咨询:"+msg);
res = "再见";
break;
default:
System.out.println("10086客服接收到用户咨询:"+msg);
res = "您好请问有什么需要帮助?";
break;
}
System.out.println("10086客户发出回复:"+res);
out.println(res);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (out != null) {
out.close();
}
}
}
}
客户端代码:
package cn.thread.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static final String CHARCODE = "utf-8";
public static void main(String[] args) {
Socket socket = null;
int port = 10086;
OutputStream socketOut = null;
BufferedReader br = null;
try {
socket = new Socket("localhost", port);
// 发送消息
String msg = "1";
// String msg2 = "2";
System.out.println("用户发出咨询:" + msg);
// System.out.println("用户发出咨询2:"+msg2);
msg = msg + "\r\n";
socketOut = socket.getOutputStream();
socketOut.write(msg.getBytes(CHARCODE));
// socketOut.write(msg2.getBytes(CHARCODE));
socketOut.flush();
socket.shutdownOutput();
// 接收服务器的反馈
br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String res = br.readLine();
if (res != null) {
System.out.println("客户接收10086客户回复:" + res);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (socketOut != null) {
try {
socketOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static final String CHARCODE = "utf-8";
public static void main(String[] args) {
Socket socket = null;
int port = 10086;
OutputStream socketOut = null;
BufferedReader br = null;
try {
socket = new Socket("localhost", port);
// 发送消息
String msg = "1";
// String msg2 = "2";
System.out.println("用户发出咨询:" + msg);
// System.out.println("用户发出咨询2:"+msg2);
msg = msg + "\r\n";
socketOut = socket.getOutputStream();
socketOut.write(msg.getBytes(CHARCODE));
// socketOut.write(msg2.getBytes(CHARCODE));
socketOut.flush();
socket.shutdownOutput();
// 接收服务器的反馈
br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String res = br.readLine();
if (res != null) {
System.out.println("客户接收10086客户回复:" + res);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (socketOut != null) {
try {
socketOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}