多个客户端上传文件

TCP使用中的多线程问题

 1、问题:一般的TCP程序在处理多线程情况时会出现问题:

    如:有A、B两个客户端向服务器发送数据,当A客户端连接上以后被服务端获取到,服务端执行具体流程;这时B客户端连接,只有等待。

        因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以暂时获取不到B客户端对象。

2、解决思路:
   服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。

程序代码:

  客户端:

 1 class PicSend{
 2
 3 public static void main(String args[]){
 4         try {
 5             Socket s = new Socket(InetAddress.getLocalHost().getHostAddress(),11001    );
 6             FileInputStream ins = new FileInputStream("test/1.jpg");
 7             OutputStream out = s.getOutputStream();
 8             //BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
 9             byte[] buf = new byte[1024];
10             int len = 0;
11             while((len = ins.read(buf))!= -1){
12                 out.write(buf, 0, len);
13             }
14
15             s.shutdownOutput();//结束图片上传,读取服务器返回信息
16
17 //            String str = bufr.readLine();
18 //            System.out.println(str);
19             InputStream in = s.getInputStream();
20             byte[] bytes = new byte[1024];
21             int lens = in.read(bytes);
22             System.out.println("服务器返回:"+ new String(bytes,0,lens));
23
24             ins.close();
25             s.close();
26
27         }  catch (Exception e) {
28             // TODO Auto-generated catch block
29             e.printStackTrace();
30         }
31
32     }
33
34
35 }

服务器端:

 1 class ThreadServer{
 2     public static void main(String args[]){
 3         try {
 4             ServerSocket server = new ServerSocket(10001);
 5
 6             while(true){  //注意:while中使用true,是因为accept方法为阻塞方法,不会导致程序无限循环
 7                 Socket s = server.accept();
 8                 new Thread(new PicThread(s)).start();
 9             }
10         } catch (IOException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14
15     }
16 }
17
18 class PicThread implements Runnable{//封装客户端,实现单线程
19     private Socket s;
20     PicThread(Socket s){
21         this.s = s;
22
23     }
24
25     public void run(){//将客户端处理代码写run方法中
26         try {
27             InputStream in = s.getInputStream();
28             FileOutputStream fout = new FileOutputStream("Thread.jpg");
29             byte[] buf = new byte[1024];
30             int len = 0;
31             while((len=in.read(buf))!=-1){
32                 fout.write(buf,0,len);
33             }
34
35             OutputStream out = s.getOutputStream();
36             byte[] bytes = "图片上传成功".getBytes();
37             out.write(bytes);
38
39             fout.close();
40             s.close();
41
42         } catch (Exception e) {
43             // TODO Auto-generated catch block
44             e.printStackTrace();
45         }
46
47     }
48     

这样就实现了多客户端向服务器发送文件。

3、设计亮点

  在这个TCP程序中十分巧妙的将服务器端将每一个客户端封装到一个单独的线程中,从而是服务器具备了处理多线程的能力;这样的设计思路在开发中非常有用。

  

    ServerSocket server = new ServerSocket(10001);

            while(true){
                Socket s = server.accept();
                new Thread(new PicThread(s)).start();
            }    
时间: 2024-10-02 23:51:15

多个客户端上传文件的相关文章

asp.net 客户端上传文件全路径获取方法

asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他方法 如下提供两种方法: 方法1:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可. 方法2: function getPath() { //获取file 控件对象 var obj =

LightSwitch Picture File Manager LS HTML 客户端上传文件

LightSwitch Picture File Manager   LS HTML 客户端上传文件: http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/157/A-Visual-Studio-LightSwitch-Picture-File-Manager.aspx LightSwitch Picture File Manager LS HTML 客户端上传文件

黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器

------- <a href="http://www.itheima.com" target="blank">android培训</a>.<a href="http://www.itheima.com" target="blank">java培训</a>.期待与您交流! ---------- import java.io.*; import java.net.*; class

Java 网络编程案例三:多个客户端上传文件

需求:每一个客户端启动后都可以给服务器上传一个文件,服务器接收到文件后保存到一个upload目录中.可以同时接收多个客户端的文件上传. 分析: (1)服务器端要“同时”处理多个客户端的请求,那么必须使用多线程,每一个客户端的通信需要单独的线程来处理. (2)服务器保存上传文件的目录只有一个upload,而每个客户端给服务器发送的文件可能重名,所以需要保证文件名的唯一.我们可以使用“时间戳”作为文件名,而后缀名不变 (3)客户端需要给服务器上传文件名(含后缀名)以及文件内容.而文件名是字符串,文件

Qt通过HTTP POST上传文件

本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收文件的方法在文章http://www.cnblogs.com/fnng/p/3740274.html中有较为清晰的讲解,我搭建的服务器端程序除了没有网页客户端以及部分变量名称不同以外,基本上与这篇文章的服务器搭建过程一样. 如果服务器端程序发生变化,这篇文章后面给出的客户端例程可能就不再适用.因此如

Android网络编程之使用HttpClient批量上传文件

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了.随之替代它的类是MultipartEntityBuilder. 下面

securecrt上传文件/下载文件

设定默认上传下载目录 options->session options ->Terminal->Xmodem/Zmodem 下 在右边设置上传和下载的目录 使用Zmodem从客户端上传文件到linux服务器 1. 在用SecureCRT登陆linux终端. 2. 选中你要放置上传文件的路径,在目录下然后输入rz命令,SecureCRT会弹出文件选择对话框,在查找范围中找到你要上传的文件,按Add按钮.然后OK就可以把文件上传到linux上了.或者在Transfer->Zmodem

ASP.NET上传文件的三种基本方法

ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关键代码: [html] view plain copy <form id="form1" runat="server"> <asp:FileUpload ID="FileUpload1" runat="server&quo

文件上传表单 上传文件的细节 文件上传下载和数据库结合

1 文件上传表单   1)上传文件的本质是文本复制的过程   2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写   3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方式,例如:     IE6:upfile=c:\aa\bb\a.JPG     非IE6: upfile=a.JPG   4)可以将form以MIME协议的方式将上传文件传递到服务端,服务端以二进制流的方式读写     代码:客户端form enctype="multipart/form-data&quo