您的位置:首页 > 编程语言 > Java开发

多线程Java Socket编程示例

2007-10-21 23:32 405 查看

多线程Java Socket编程示例

http://www.blogjava.net/sterning/archive/2007/10/15/152940.html

Posted on 2007-10-15 12:37 诗特林 阅读(804) 评论(0) 编辑 收藏 所属分类: Java


多线程Java Socket编程示例

这篇做为学习孙卫琴<<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();


}


}




};


}


}



从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子---Java基于Socket文件传输示例,就可以实现多线程文件的传输了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: