当前位置:文档之家› 多线程socket编程

多线程socket编程

多线程Java Socket编程示例这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一接口Future1.服务端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 .*;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.getRuntim e().availableProcessors()*POOL_SIZE);//工厂类创建固定线程数(CPU核心数*每个U 线程池大小)的线程池System.out.println("服务器启动");}public void service(){//服务方法负责打开端口,执行服务器线程方法while(true){Socket socket=null;//客户端请求服务器打开的sockettry {//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接socket=serverSocket.accept();executorService.execute(new Handler(socket));//连接后执行excute()} catch (Exception e) {e.printStackTrace();}}}public static void m ain(String[] args) throws IOException {new MultiThreadServer().service();}}class Handler implem ents Runnable{private Socket socket;public Handler(Socket socket){//传一个socket进来this.socket=socket;}private PrintWriter getWriter(Socket socket) throws IOException{OutputStream socketOut=socket.getOutputStream();return new PrintWriter(socketOut,true);}private BufferedReader get Reader(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(){//线程池中execute()就执行这个方法try {System.out.println("New connection accepted "+socket.getInetAddre ss()+":"+socket.getPort());BufferedReader br=getReader(socket);//获取输入流PrintWriter pw=getWriter(socket);//获取输出流String m sg=null;while((msg=br.readLine())!=null){//读输入流System.out.println(msg);pw.println(echo(m sg));if(m sg.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 .Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MultiThreadClient {public static void m ain(String[] args) {int num Tasks = 10;ExecutorService exec = Executors.newCachedThreadPool();//客户端创建可变数量的线程池for (int i = 0; i < num Tasks; 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);//客户端建立socket// 发送关闭命令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文件传输示例,就可以实现多线程文件的传输了Java基于Socket文件传输示例最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。

在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。

废话少说,先来看服务器端的程序。

类DataOutputStream类DataInputStream类FileOutputStream1.服务器端package sterning;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import .ServerSocket;import .Socket;public class ServerTest {int port = 8821;void start() {Socket s =null;try {ServerSocket ss = new ServerSocket(port);while (true) {// 选择进行传输的文件String filePath = "D:\\lib.rar";File fi = new File(filePath);System.out.println("文件长度:" + (int) fi.length());// public Socket accept() throws// IOException侦听并接受到此套接字的连接。

此方法在进行连接之前一直阻塞。

s =ss.accept();//接受客户端连接,建立一个通信端口System.out.println("建立socket链接");DataInputStream dis = new DataInputStream(new BufferedI nputStream(s.getInputStream()));//获取输入流dis.readByte();DataInputStream fis = new DataInputStream(new BufferedIn putStream(new FileInputStream(filePath)));//硬盘文件输入流DataOutputStream dos = new DataOutputStream(s.getOutput Stream());//获取输出流//将文件名及长度传给客户端。

相关主题