前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Socket编程 多线程server和client通信demo(转)

Java Socket编程 多线程server和client通信demo(转)

原创
作者头像
在下是首席架构师
发布2022-08-18 20:26:28
4980
发布2022-08-18 20:26:28
举报
文章被收录于专栏:从入门到出门从入门到出门
Server
代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class TCPServer {
    public static Map<String, Socket> socketMap = new HashMap<String, Socket>();

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(10000);// 创建服务器socket,监听10000端口

        // 开启信息发送的线程
        sendMsgThread();
        // 循环进行与客户端的连接
        while (true) {
            Socket socket = server.accept();// 阻塞,等待客户端的连接
            serverThread(socket);// 新建通信线程
        }
    }

    /**
     * 
     * @Title: serverThread
     * @Desc: 多线程 接收客户端信息
     *
     * @param socket
     *            参数
     *
     */
    public static void serverThread(Socket socket) {
        // 新线程
        new Thread(new Runnable() {
            public void run() {
                BufferedReader in = null;
                PrintWriter out = null;
                try {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String msg = in.readLine();// 读取客户发来的信息
                    socketMap.put(msg.split(" ")[1], socket);
                    while (true) {
                        if ("bye".equals(msg.split(":")[1].trim())) {// 若客户端发来bye,则跳出循环,即关闭当前线程
                            socketMap.remove(socket);//将socket从map中移除
                            break;
                        }
                        System.out.println(msg);// 打印客户端发来的信息
                        msg = in.readLine();// 读取客户发来的信息
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {// 关闭io
                    in.lines();
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();// 开启线程,将自动运行run方法
    }

    /**
     * 
     * @Title: sendMsgThread
     * @Desc: 发送信息给客户端
     *
     */
    public static void sendMsgThread() {
        new Thread(new Runnable() {
            PrintWriter out = null;
            BufferedReader toClient = null;

            public void run() {
                try {
                    while (true) {
                        System.out.println("say to who?:");
                        Scanner s = new Scanner(System.in);//输入要发送的客户端的name
                        String name = s.nextLine();
                        Socket socket = socketMap.get(name);//从map中获取name对应的socket
                        if (socket == null) {
                            System.out.println("this client not exist");
                            continue;
                        }
                        out = new PrintWriter(socket.getOutputStream());
                        System.out.println("say what?:");
                        toClient = new BufferedReader(new InputStreamReader(System.in));
                        String send = toClient.readLine();

                        out.println("server " + Thread.currentThread().getId() + " say: " + send);// 将信息发送给客户端
                        out.flush();// 刷新
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    out.close();
                    try {
                        toClient.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }
}
Client
代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost", 10000);// 创建socket,连接localhost(127.0.0.1)的10000端口
        System.out.println("enter your name:");
        Scanner s = new Scanner(System.in);// 控制台输入name
        String name = s.nextLine();// 读取
        System.out.println("say to server:");

        PrintWriter out = new PrintWriter(socket.getOutputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        readThread(socket);
        while (true) {
            String msg = reader.readLine();// 读取控制台输入信息
            out.println("=========>>>client " + name + " say: " + msg);// 发送信息到服务器
            if ("bye".equals(msg)) {
                break;
            }
            out.flush();
        }
        reader.close();
        out.close();
        socket.close();
    }

    /**
     * 
    * @Title: readThread
    * @Desc: 新开线程读取服务器发来的信息
    *
    *  @param socket 参数
    *
     */
    public static void readThread(Socket socket) {
        new Thread(new Runnable() {
            public void run() {
                BufferedReader in = null;
                try {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    while (true) {
                        String str = in.readLine();
                        System.out.println(str);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Server
  • Client
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档