zoukankan      html  css  js  c++  java
  • [Socket]Socket聊天小程序

    一个简单是Socket聊天小程序,读写操作在不同的线程中。服务器端采用线程池。

    1、Server

    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Server
    {
        private static final ExecutorService threadWorkers = Executors
                .newCachedThreadPool();
    
        private void start() throws IOException
        {
            ServerSocket server = new ServerSocket(8899);
            while (true)
            {
                Socket socket = server.accept();
                threadWorkers.execute(new ThreadWorker(socket));
            }
    
        }
    
        public static void main(String[] args) throws IOException
        {
            Server server = new Server();
            server.start();
        }
    }

    2、Client

    import java.net.Socket;
    
    public class Client
    {
        public static void main(String[] args) throws Exception
        {
            Socket socket = new Socket("127.0.0.1", 8899);
            new Thread(new InputReceiverAndSender(System.in,socket.getOutputStream())).start();
            new Thread(new SocketReader("Server", socket.getInputStream())).start();       
        }
    }

    3、InputReceiverAndSender

    import java.io.*;
    
    public class InputReceiverAndSender implements Runnable
    {
        private BufferedReader receiver;
    
        private BufferedWriter sender;
    
        private InputStream input;
        
        static int i = 0;
        
        String name;
    
        public InputReceiverAndSender(InputStream input, OutputStream output)
        {
            super();
            name = ""+(i++);
            this.input = input;
            this.receiver = new BufferedReader(new InputStreamReader(input));
            this.sender = new BufferedWriter(new OutputStreamWriter(output));
        }
    
        public void run()
        {
            String message = null;
            try
            {
                try
                {
                    do
                    {
                        synchronized (input)
                        {
                            message = receiver.readLine();
                        }
                        System.out.println(name+":"+message);
                        sender.write(message);
                        // 写入行结束标志,如果省略这句,另一端是无法读入的
                        sender.newLine();
                        sender.flush();
                    }
                    while (message != null);
                }
                finally
                {
                    receiver.close();
                    sender.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    4、SocketReader

    import java.io.*;
    
    public class SocketReader implements Runnable
    {
        private BufferedReader receiver;
        private String name;
    
        public SocketReader(String name, InputStream input)
        {
            super();
            this.name = name;
            this.receiver = new BufferedReader(new InputStreamReader(input));
        }
    
        public void run()
        {
            try
            {
                try
                {
                    String message = null;
                    while ((message = receiver.readLine()) != null)
                    {
                        System.out.println(name + ":" + message);
                    }
                }
                finally
                {
                    receiver.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    5、ThreadWorker

    import java.io.IOException;
    import java.net.Socket;
    
    public class ThreadWorker implements Runnable
    {
    
        private static int id = 1;
    
        private Socket socket;
    
        public ThreadWorker(Socket socket)
        {
            this.socket = socket;
        }
    
        @Override
        public void run()
        {
            System.out.println("connected...");
            // 输入及发送线程
            try
            {
                new Thread(new InputReceiverAndSender(System.in,
                        socket.getOutputStream())).start();
                // 读线程
                new Thread(new SocketReader("Agent" + (id++),
                        socket.getInputStream())).start();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
    
        }
    }
  • 相关阅读:
    使用cmd命令行窗口操作SqlServer
    .net core compatibility windows & windows compatible Linux
    Microsoft Azure Tutorial: Build your first movie inventory web app with just a few lines of code
    Running ASP.NET Core applications on Windows Subsystem for Linux
    Simple Use IEnumerable<T>
    JSON in SQL Server 2016
    [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
    NotBacon
    Create an Azure SQL database in the Azure portal
    Cisco IP 电话 将它的voice mail 发送到手机
  • 原文地址:https://www.cnblogs.com/jfqiu/p/3233281.html
Copyright © 2011-2022 走看看