黑马程序员技术交流社区

标题: 【黑马云青年 胡浩】关于服务器使用多线程技术同时处理.... [打印本页]

作者: 胡浩    时间: 2013-6-2 15:52
标题: 【黑马云青年 胡浩】关于服务器使用多线程技术同时处理....
本帖最后由 胡浩 于 2013-6-2 15:55 编辑

下面的代码实现一个多个客户端往同一个服务端上传图片的功能,我的疑问是,服务端在使用serverSocket提供服务的时候必须要明确端口号,比如serverSocket ss=new serverSocket(10006);
然后在通过accept获取Socket对象。和指定的客户端进行交互,问题是每个客户端的端口号可能不一样,那么serverSocket ss=new serverSocket(10006)这样指定端口后不是只能为一个客户端服务了吗?
是吗,如何解决这个问题?
这里使用多线程封装了处理客户端请求的任务。
  1. package cn.itcast.net.p1.uploadpic;

  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.Socket;

  8. public class UploadTask implements Runnable {

  9.         private static final int SIZE = 1024*1024*2;
  10.         private Socket s;

  11.         public  UploadTask(Socket s) {
  12.                 this.s = s;
  13.         }

  14.         @Override
  15.         public void run() {

  16.                 int count = 0;
  17.                 String ip = s.getInetAddress().getHostAddress();
  18.                 System.out.println( ip + ".....connected");
  19.                
  20.                 try{

  21.                 // 读取客户端发来的数据。
  22.                 InputStream in = s.getInputStream();

  23.                 // 将读取到数据存储到一个文件中。
  24.                 File dir = new File("c:\\pic");
  25.                 if (!dir.exists()) {
  26.                         dir.mkdirs();
  27.                 }
  28.                 File file = new File(dir, ip + ".jpg");
  29.                 //如果文件已经存在于服务端
  30.                 while(file.exists()){
  31.                         file = new File(dir,ip+"("+(++count)+").jpg");
  32.                 }
  33.                
  34.                
  35.                 FileOutputStream fos = new FileOutputStream(file);

  36.                 byte[] buf = new byte[1024];

  37.                 int len = 0;

  38.                 while ((len = in.read(buf)) != -1) {
  39.                         
  40.                         
  41.                         
  42.                         fos.write(buf, 0, len);
  43.                         
  44.                         if(file.length()>SIZE){
  45.                                 System.out.println(ip+"文件体积过大");
  46.                                 
  47.                                 fos.close();
  48.                                 s.close();
  49.                                 
  50.                                 
  51.                                 System.out.println(ip+"...."+file.delete());
  52.                                 
  53.                                 return ;
  54.                         }
  55.                 }

  56.                 // 获取socket输出流,将上传成功字样发给客户端。
  57.                 OutputStream out = s.getOutputStream();
  58.                 out.write("上传成功".getBytes());

  59.                 fos.close();
  60.                 s.close();
  61.                 }catch(IOException e){
  62.                         
  63.                 }

  64.         }

  65. }
复制代码
这里是服务端。
  1. package cn.itcast.net.p1.uploadpic;

  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;

  9. public class UploadPicServer {

  10.         /**
  11.          * @param args
  12.          * @throws IOException
  13.          */
  14.         public static void main(String[] args) throws IOException {
  15.                         
  16.                 //创建tcp的socket服务端。
  17.                ServerSocket ss = new ServerSocket(10006);
  18.                
  19.                 while(true){
  20.                         Socket s = ss.accept();                     
  21.                         
  22.                         new Thread(new UploadTask(s)).start();               
  23.                         
  24.                 }
  25.                 //获取客户端。
  26.                
  27.                
  28. //                ss.close();
  29.                
  30.                
  31.         }

  32. }
复制代码
这里是客户端
  1. package cn.itcast.net.p1.uploadpic;

  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.Socket;
  7. import java.net.UnknownHostException;

  8. public class UploadPicClient {

  9.         /**
  10.          * @param args
  11.          * @throws IOException
  12.          * @throws UnknownHostException
  13.          */
  14.         public static void main(String[] args) throws UnknownHostException, IOException {

  15.                
  16.                 //1,创建客户端socket。
  17.                 Socket s = new Socket("192.168.1.100",10006);
  18.                
  19.                 //2,读取客户端要上传的图片文件。
  20.                 FileInputStream fis = new FileInputStream("c:\\0.bmp");
  21.                
  22.                 //3,获取socket输出流,将读到图片数据发送给服务端。
  23.                 OutputStream out = s.getOutputStream();
  24.                
  25.                 byte[] buf = new byte[1024];
  26.                
  27.                 int len = 0;
  28.                
  29.                 while((len=fis.read(buf))!=-1){
  30.                         out.write(buf,0,len);
  31.                 }
  32.                
  33.                 //告诉服务端说:这边的数据发送完毕。让服务端停止读取。
  34.                 s.shutdownOutput();
  35.                
  36.                
  37.                 //读取服务端发回的内容。                 
  38.                 InputStream in  = s.getInputStream();
  39.                 byte[] bufIn = new byte[1024];
  40.                
  41.                 int lenIn = in.read(buf);
  42.                 String text = new String(buf,0,lenIn);
  43.                 System.out.println(text);
  44.                
  45.                 fis.close();
  46.                 s.close();
  47.                
  48.                
  49.                
  50.                
  51.         }

  52. }
复制代码
代码贴的有点多,请原谅!!!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2