• java socket 多线程通讯


    1.目录结构

    2.Server.java 代码

    package de.bvb.server;
    
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import de.bvb.util.IOUtils;
    import de.bvb.util.ReaderThread;
    import de.bvb.util.WriterThread;
    
    /**
     * 参考: http://www.cnblogs.com/jpwz/p/5705160.html
     */
    public class Server {
        public static void main(String[] args) {
            Server server = new Server();
            server.init();
        }
    
        private void init() {
            ServerSocket serverSocket = null;
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(9999);
                System.out.println("服务已启动...");
    
                while (true) {
                    socket = serverSocket.accept();
                    System.out.println(socket.getInetAddress().getHostAddress() + "@" + socket.getPort() + " 已连接");
                    // 分别启动读写线程
                    new ReaderThread(socket).start();
                    new WriterThread(socket).start();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeCloseable(serverSocket);
            }
    
        }
    }

    3.client.java 代码

    package de.bvb.client;
    
    import java.net.Socket;
    
    import de.bvb.util.IOUtils;
    import de.bvb.util.ReaderThread;
    import de.bvb.util.WriterThread;
    
    public class Client {
        public static void main(String[] args) {
            Client client = new Client();
            client.init();
        }
    
        private void init() {
            try {
                Socket socket = new Socket("127.0.0.1", 9999);
                System.out.println(socket.getInetAddress().getHostAddress() + "@" + socket.getLocalPort() + " 已连接上服务器");
    
                new ReaderThread(socket).start();
                new WriterThread(socket).start();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }

    4.util下的代码

    package de.bvb.util;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    public class ReaderThread extends Thread {
        private Socket socket;
    
        public ReaderThread(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String content;
                while (null != (content = reader.readLine())) {
                    System.out.println(content);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeCloseable(reader, socket);
            }
        }
    }
    package de.bvb.util;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    public class WriterThread extends Thread {
        private Socket socket;
    
        public WriterThread(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            BufferedWriter writer = null;
            BufferedReader reader = null;
            try {
                String name = socket.getInetAddress().getHostAddress() + "@" + socket.getLocalPort();
                reader = new BufferedReader(new InputStreamReader(System.in));
                writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                String content;
                while (null != (content = reader.readLine())) {
                    System.out.println(name + "说: " + content);
                    writer.write(name + "说: " + content + "
    ");
                    writer.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeCloseable(reader, writer, socket);
            }
        }
    }
    package de.bvb.util;
    
    import java.io.Closeable;
    import java.io.IOException;
    
    public class IOUtils {
    
        public static void closeCloseable(Closeable... closeable) {
            try {
                if (closeable != null && closeable.length > 0) {
                    for (Closeable c : closeable) {
                        if (c != null) {
                            c.close();
                        }
                    }
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
  • 相关阅读:
    LeetCode剑指Offer03
    腾讯软件开发客户端开发实习生二面
    luogu P2801 教主的魔法 分块
    luogu P3396 哈希冲突 根号算法
    luogu P1972 [SDOI2009]HH的项链 树状数组
    BZOJ 2440: [中山市选2011]完全平方数 莫比乌斯函数 容斥原理 二分答案
    柳阴直,烟里丝丝弄碧
    卡通别名
    它们
    高中随笔
  • 原文地址:https://www.cnblogs.com/Westfalen/p/6251473.html
Copyright © 2020-2023  润新知