服务器端代码

 import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.Socket;

 import javax.servlet.http.HttpServlet;

 /**
  * 文件上传多线程版本,服务器端
  *
  * @author Administrator
  *
  */
 public class TCPServer extends HttpServlet {

     public void upload() throws Exception {

         // 创建服务器,等待客户端连接
         ServerSocket serverSocket = new ServerSocket(8880);
         System.out.println("=====================服务器端已启动,等待客户端连接====================");
         // 实现多个客户端连接服务器的操作
         while (true) {
             final Socket clientSocket = serverSocket.accept();
             // 启动线程
             new Thread() {
                 public void run() {
                     try {
                         // 显示哪个客户端连接上了服务器
                         // 得到ip地址对象
                         InetAddress ipAddress = clientSocket.getInetAddress();
                         // 得到ip 地址字符串
                         String ip = ipAddress.getHostAddress();
                         System.out.println("客户端IP:" + ip);
                         // 获取Socket输入流
                         InputStream in = clientSocket.getInputStream();
                         // 创建目的地的字节输出流
                         BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(
                                 "D:\\uploadTest1\\" + ip + "(" + System.currentTimeMillis() + ").png"));
                         // 把Socket输入流中的数据,写入目的地的字节输出流中
                         byte[] buffer = new byte[1024];
                         int len = -1;
                         while ((len = in.read(buffer)) != -1) {
                             // 写入目的地的字节输出流中
                             fileOut.write(buffer, 0, len);
                         }

                         // ====================反馈信息====================
                         // 获取Socket的输出流,作用:写反馈信息给客户端
                         OutputStream out = clientSocket.getOutputStream();
                         // 写反馈信息给客户端
                         out.write("图片上传成功".getBytes());
                         // 关闭流
                         out.close();
                         fileOut.close();
                         in.close();
                         clientSocket.close();
                     } catch (IOException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     }
                 }
             }.start();
         }
     }

 }

客户端代码

 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;

 /**
  * 文件上传客户端
  *
  * @author Administrator
  *
  */
 public class TCPClient {

     public static void upload() throws Exception {

         // 创建客户端Socket,链接服务器
         Socket socket = new Socket("IP", 8880);
         System.out.println("====================客户端已连接====================");
         // 获取Socket流中的输出流,功能:用来把数据写到服务器
         OutputStream out = socket.getOutputStream();
         // 创建字节输入流,功能:用来读取数据源(图片)的字节
         BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("D:\\uploadTest\\img.png"));
         // 把图片数据写到Socket的输出流中(把数据传给服务器)
         byte[] buffer = new byte[1024];
         int len = -1;
         // read返回值是读入缓冲区的字节总数
         while ((len = fileIn.read(buffer)) != -1) {
             // 把数据写到Socket的输出流中
             out.write(buffer, 0, len);
         }
         // 客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器
         socket.shutdownOutput();

         // ====================反馈信息====================
         // 获取Socket的输入流,作用:读取反馈信息
         InputStream in = socket.getInputStream();
         // 读反馈信息
         byte[] info = new byte[1024];
         // 把反馈信息存储到info数组中,并记录字节个数
         int length = in.read(info);
         // 显示反馈结果
         System.out.println(new String(info, 0, length));
         // 关闭流
         in.close();
         fileIn.close();
         out.close();
         socket.close();
     }

 }

测试代码

 public class Test {

     public static void main(String[] args) throws Exception{

         TCPClient.upload();

     }

 }

遇到的问题:

  在用Tomcat启动ServerSocket时,会卡死,解决办法:

  1,在 web.xml 中配置    

 <servlet>
   <servlet-name>serverSocket</servlet-name>
     <servlet-class>com.xxx.test.protocol.UploadTest.StartServer</servlet-class>
     <load-on-startup>3</load-on-startup>  
 </servlet>
 <servlet-mapping>
     <servlet-name>serverSocket</servlet-name>
     <url-pattern>/TCPServer/*</url-pattern>
 </servlet-mapping>

  2, 

 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;

 public class StartServer extends HttpServlet {

     public void init() throws ServletException {

         Thread s = new StartThread();
         s.setDaemon(true);// 设置线程为后台线程,tomcat不会被hold,启动后依然一直监听。
         s.start();

     }

 }

  3,

 public class StartThread extends Thread {

     public void run() {

         try {
             TCPServer server = new TCPServer();
             server.upload();// 启动开启服务,监听
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } 

     }

 }

使用 ServerSocket 进行文件上传,以及用Tomcat启动ServerSocket时,会卡死解决的更多相关文章

  1. javaweb中的文件上传的一般写法(初次接触时写)

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1. 通过form表单向后端发送请求 <form id=&quo ...

  2. (转)文件上传org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed

    文件上传时,tomcat报错org.springframework.web.multipart.MultipartException: Failed to parse multipart servle ...

  3. django 文件上传

    模板文件: <form method='post' action='/script/upload/' enctype="multipart/form-data" accept ...

  4. html form一点基础知识,实现文件上传

    form用于提交文件需要修改其entype属性. enctype属性:规定在发送表单数据之前如何对其进行编码. 默认情况,enctype的编码格式是application/x-www-form-url ...

  5. struts——文件上传

    上传文件在一个系统当中是一个很常用的功能,也是一个比较重要的功能.今天我们就一起来学习一下Struts2如何上传文件. 今天讲的上传文件的方式有三种: 1,以字节为单位传输文件: 2,Struts2封 ...

  6. 文件上传<springmvc>

    使用commons-fileupload-1.3.1.jar和commons-io-2.4.jar web.xml <?xml version="1.0" encoding= ...

  7. 与文件上传到的三个类:FileItem类、ServletFileUpload 类、DiskFileItemFactory类

    文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 在使用ServletFileUpload对象解析请求时需要根据DiskFi ...

  8. Node.js:上传文件,服务端如何获取文件上传进度

    内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...

  9. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

随机推荐

  1. 获取Windows用户所有的账户名

    /// <summary> /// 设置用户密码 /// </summary> [DllImport("Netapi32.dll")] extern sta ...

  2. jquery获取input值的各种情况

    jQuery获取多种input值的方法 获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").at ...

  3. Android开发pool解析xml

    xml在开发中的作用不可小觑,很多时候我们都要用到这种文件,所以学习它的解析方式很是必要. 我们都知道java中xml的解析有:dom,SAX,但是Android下我们使用pool解析,是更为方便,而 ...

  4. android 之EditText输入检測

    近期开发一个功能的时候发生一个故事,其情节例如以下: 功能事实上不复杂,当中须要一个EditText来获取用户输入的信息.于是,我做了一个Dialog来显示我的输入界面(代码例如以下): mAlert ...

  5. CUDA编程(十)使用Kahan&#39;s Summation Formula提高精度

    CUDA编程(十) 使用Kahan's Summation Formula提高精度 上一次我们准备去并行一个矩阵乘法.然后我们在GPU上完毕了这个程序,当然是非常单纯的把任务分配给各个线程.也没有经过 ...

  6. [学习笔记]overthewire bandit 通关秘籍

    1.第一关 使用putty等工具连入linux即可,注意port等设置. ls 列目录内文件: cat readme,显示文件内容,即可看到密码. 2.第二关 如何查看文件名为-的文件? cat ./ ...

  7. ASP.NET MVC 提供与访问 Web Api

    ASP.NET MVC 提供与访问 Web Api 一.提供一个 Web Api 新建一个项目,类型就选 "Web Api".我用的是MVC5,结果生成的项目一大堆东西,还编译不过 ...

  8. 让Linq的OrderBy支持动态字段

    使用linq的OrderBy,如果明确知道是哪个字段,当然很容易: IQueryable<User> userQuery = ...; userQuery.OrderBy(u => ...

  9. Delphi全角转半角

    function ToDBC( input :String):WideString;varc:WideString;i:Integer;beginc := input;for i:=1 to Leng ...

  10. java定时器2-spring实现

    spring定时器(基于xml) spring定时器(基于注解) quartz定时器 1.使用基于xml配置的spring定时器 首先编写定时任务类Mytask public class Mytask ...