代码改变世界

多线程Java Socket编程示例

2011-04-29 10:56  myjava2  阅读(171)  评论(0编辑  收藏  举报

这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.

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

            }


        }
;
    }

}