zoukankan      html  css  js  c++  java
  • 【z】多线程Java Socket编程示例

    1.服务端
    package sterning;

    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.*;
    import java.util.concurrent.*;

    public class MultiThreadServer {
        
    private int port=8821;
        
    private ServerSocket serverSocket;
        
    private ExecutorService executorService;//线程池
        private final int POOL_SIZE=10;//单个CPU线程池大小
        
        
    public MultiThreadServer() throws IOException{
            serverSocket
    =new ServerSocket(port);
            
    //Runtime的availableProcessor()方法返回当前系统的CPU数目.
            executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
            System.out.println(
    "服务器启动");
        }

        
        
    public void service(){
            
    while(true){
                Socket socket
    =null;
                
    try {
                    
    //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
                    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{
        
    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 String echo(String msg){
            
    return "echo:"+msg;
        }

        
    public void run(){
            
    try {
                System.out.println(
    "New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
                BufferedReader br
    =getReader(socket);
                PrintWriter pw
    =getWriter(socket);
                String msg
    =null;
                
    while((msg=br.readLine())!=null){
                    System.out.println(msg);
                    pw.println(echo(msg));
                    
    if(msg.equals("bye"))
                        
    break;
                }

            }
     catch (IOException e) {
                e.printStackTrace();
            }
    finally{
                
    try {
                    
    if(socket!=null)
                        socket.close();
                }
     catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }

    2.客户端
    package sterning;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    public class MultiThreadClient {
        
        
    public static void main(String[] args) {
            
    int numTasks = 10;
            
            ExecutorService exec 
    = Executors.newCachedThreadPool();

            
    for (int i = 0; i < numTasks; i++{
                exec.execute(createTask(i));
            }


        }


        
    // 定义一个简单的任务
        private static Runnable createTask(final int taskID) {
            
    return new Runnable() {
                
    private Socket socket = null;
                
    private int port=8821;

                
    public void run() {
                    System.out.println(
    "Task " + taskID + ":start");
                    
    try {                    
                        socket 
    = new Socket("localhost", port);
                        
    // 发送关闭命令
                        OutputStream socketOut = socket.getOutputStream();
                        socketOut.write(
    "shutdown\r\n".getBytes());

                        
    // 接收服务器的反馈
                        BufferedReader br = new BufferedReader(
                                
    new InputStreamReader(socket.getInputStream()));
                        String msg 
    = null;
                        
    while ((msg = br.readLine()) != null)
                            System.out.println(msg);
                    }
     catch (IOException e) {                    
                        e.printStackTrace();
                    }

                }


            }
    ;
        }

    }


    origin:
    http://www.blogjava.net/sterning/archive/2007/10/15/152940.html
  • 相关阅读:
    《Android进阶之光》--RxJava
    《Android进阶之光》--RxJava实现RxBus
    《Android进阶之光》--RxJava结合Retrofit访问网络
    《Java并发编程的艺术》--Java中的锁
    《深入探索Androdi热修复技术原理(阿里巴巴)》--读书笔记
    Smali语法
    《Android进阶之光》--网络编程与网络框架
    《Android进阶之光》--多线程编程
    《Android进阶之光》--View体系与自定义View
    《Android进阶之光》--Material Design
  • 原文地址:https://www.cnblogs.com/pony/p/1538642.html
Copyright © 2011-2022 走看看