JAVA多线程Socket实现

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();
            }
        }
    }
}


客户端代码:
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();
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u010786396/article/details/68925143