程序实现的是一个读取照片(可改为其文件类型)的服务端,可同时接受多个客户端连接,并且同时接受多张图片的数据。主要是通过多线程控制,每次检测到有请求连接,则开辟一个新线程,新线程的作用是接受图片, 通过不同线程同时运行达到可同时接收多张图片。

1. 这是服务端的源代码:


01. 
   import java.io.*;
 
  
 
   02. 
   import java.net.*;
 
  
 
   03. 
   public class LoadPicServer {
 
  
 
   04. 
   public static void main(String[] args) throws IOException {
 
  
 
   05. 
   int listen_port = 10005;      //监听的端口号
 
  
 
   06. 
   long filecount = 1;      
 
  
 
   07. 
   ServerSocket ss = new ServerSocket(listen_port);          //监听listen_port端口
 
  
 
   08. 
   if(ss.isBound())
 
  
 
   09. 
   System.out.println("The Server is listenning the port " + listen_port);
 
  
 
   10. 
   while(true) {
 
  
 
   11. 
   Socket s = ss.accept();   //检查是否有连接,该语句是阻塞语句,如果没有则会停在这。
 
  
 
   12. 
   if(s.isConnected()) {    //如果有连接则返回true,执行下面语句
 
  
 
   13. 
   String filename = new String("ServerPic" + filecount++ + ".jpg");
 
  
 
   14. 
   System.out.println(s.getInetAddress().getHostAddress()
 
  
 
   15. 
   + " is connected!");                //获取已连接的客户端的IP
 
  
 
   16. 
   new Thread(new LoadPic(s,filename)).start();            //开启新线程接收图片,主线程继续回去while最开始检查有无连接。
 
  
 
   17. 
   }
 
  
 
   18. 
   }
 
  
 
   19. 
   }
 
  
 
   20. 
   }
 
  
 
   21. 
   /*
 
  
 
   22. 
   * 该类实现Runnable接口,用于实现多线程复制图片。
 
  
 
   23. 
   * 该类的作用就是与主线程传入的Socket连接进行通信,从网络流获取对方的传送的文件数据。
 
  
 
   24. 
   * */
 
  
 
   25. 
   class LoadPic implements Runnable {
 
  
 
   26. 
   Socket s = null;
 
  
 
   27. 
   String filename = null;
 
  
 
   28. 
   BufferedInputStream bufin = null;
 
  
 
   29. 
   BufferedOutputStream bufout = null;
 
  
 
   30. 
   PrintWriter return_txt = null;
 
  
 
   31. 
    
 
  
 
   32. 
   public LoadPic(Socket s,String filename) {
 
  
 
   33. 
   this.s = s;
 
  
 
   34. 
   this.filename = filename;
 
  
 
   35. 
   }
 
  
 
   36. 
    
 
  
 
   37. 
   public void run() { 
 
  
 
   38. 
   try {
 
  
 
   39. 
   bufin = new BufferedInputStream(s.getInputStream());                  //获取传入Socket的输入流,用于读取图片数据
 
  
 
   40. 
   bufout = new BufferedOutputStream(new FileOutputStream(filename));    //在当前文件夹创建名为filename的文件,作为输出流的目的。
 
  
 
   41. 
   return_txt = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true); //该流用来向客户端发送确认信息。
 
  
 
   42. 
   byte[] bufdata = new byte[1024];
 
  
 
   43. 
   int len;
 
  
 
   44. 
   while((len = bufin.read(bufdata)) != -1) {              //从输入流读取数据,不为-1,即文件结束则继续读。
 
  
 
   45. 
   bufout.write(bufdata,0,len);                         //往文件里写数据
 
  
 
   46. 
   bufout.flush();
 
  
 
   47. 
   }
 
  
 
   48. 
    
 
  
 
   49. 
   return_txt.println("服务器接收成功!");
 
  
 
   50. 
    
 
  
 
   51. 
   } catch (IOException e) {
 
  
 
   52. 
   e.printStackTrace();
 
  
 
   53. 
   } finally {
 
  
 
   54. 
   try {
 
  
 
   55. 
   s.close();
 
  
 
   56. 
   bufin.close();
 
  
 
   57. 
   bufout.close();
 
  
 
   58. 
   return_txt.close();
 
  
 
   59. 
   } catch (IOException e) {
 
  
 
   60. 
   e.printStackTrace();
 
  
 
   61. 
   }
 
  
 
   62. 
   }
 
  
 
   63. 
   }
 
  
 
   64. 
   }


2. 这是客户端源代码,可同时开启多个客户端,做图片并行传输测试。因为多个客户端代码基本一样,所以只需看下面代码即可:

 



01. 
   import java.net.*;
 
  
 
   02. 
   import java.io.*;
 
  
 
   03. 
   //该类是客户端类,向服务器段发送请求连接,连接后就可以发送图片数据。
 
  
 
   04. 
   class UpPicClient {
 
  
 
   05. 
   public static void main(String[] args) throws IOException,InterruptedException {
 
  
 
   06. 
   Socket s = new Socket("192.168.1.7",10005);
 
  
 
   07. 
   if(s.isBound()) {
 
  
 
   08. 
   System.out.println("Connect successful!");
 
  
 
   09. 
   BufferedInputStream bufin = new BufferedInputStream(new FileInputStream("1.jpg"));
 
  
 
   10. 
   BufferedOutputStream bufout = new BufferedOutputStream(s.getOutputStream());
 
  
 
   11. 
   BufferedInputStream confirm_txt = new BufferedInputStream(s.getInputStream());
 
  
 
   12. 
   byte[] bufdata = new byte[1024];
 
  
 
   13. 
   int len;
 
  
 
   14. 
   while((len = bufin.read(bufdata)) != -1) {
 
  
 
   15. 
   bufout.write(bufdata,0,len);
 
  
 
   16. 
   bufout.flush();
 
  
 
   17. 
   }
 
  
 
   18. 
   s.shutdownOutput();
 
  
 
   19. 
   System.out.println("发送结束!");
 
  
 
   20. 
   len = confirm_txt.read(bufdata,0,bufdata.length);
 
  
 
   21. 
   String str = new String(bufdata,0,len);
 
  
 
   22. 
   System.out.println(str);
 
  
 
   23. 
   s.close();
 
  
 
   24. 
   bufin.close();
 
  
 
   25. 
   bufout.close();
 
  
 
   26. 
   confirm_txt.close();
 
  
 
   27. 
   }
 
  
 
   28. 
   }
 
  
 
   29. 
   }