使用 ServerSocket 进行文件上传,以及用Tomcat启动ServerSocket时,会卡死解决
服务器端代码
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时,会卡死解决的更多相关文章
- javaweb中的文件上传的一般写法(初次接触时写)
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1. 通过form表单向后端发送请求 <form id=&quo ...
- (转)文件上传org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed
文件上传时,tomcat报错org.springframework.web.multipart.MultipartException: Failed to parse multipart servle ...
- django 文件上传
模板文件: <form method='post' action='/script/upload/' enctype="multipart/form-data" accept ...
- html form一点基础知识,实现文件上传
form用于提交文件需要修改其entype属性. enctype属性:规定在发送表单数据之前如何对其进行编码. 默认情况,enctype的编码格式是application/x-www-form-url ...
- struts——文件上传
上传文件在一个系统当中是一个很常用的功能,也是一个比较重要的功能.今天我们就一起来学习一下Struts2如何上传文件. 今天讲的上传文件的方式有三种: 1,以字节为单位传输文件: 2,Struts2封 ...
- 文件上传<springmvc>
使用commons-fileupload-1.3.1.jar和commons-io-2.4.jar web.xml <?xml version="1.0" encoding= ...
- 与文件上传到的三个类:FileItem类、ServletFileUpload 类、DiskFileItemFactory类
文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 在使用ServletFileUpload对象解析请求时需要根据DiskFi ...
- Node.js:上传文件,服务端如何获取文件上传进度
内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...
- Spring Cloud Zuul 中文文件上传乱码
原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...
随机推荐
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- 在调试C++程序是出现这个问题的解决方案illegal pure syntax, must be '= 0'
笔者在调试c++的时候遇见了这个问题 E:\Data Struct\SqString\新建 文本文档.cpp(5) : error C2258: illegal pure syntax, must b ...
- adb端口被占用情况下如何杀掉进程
1.CMD命令窗口输入:adb nodaemon server .然后就会提示你哪个端口被占用了. 2.输入netstat -ano | findstr "5037" .然后会弹出 ...
- su: /bin/bash: Permission denied带来的疑惑
>客户一个oracle突然当机了,由于业务启动,客户下意识的重启了服务器,系统是起来了,准备切换到oracle用户下启动数据库,可以怎么都无法su切换,真是火上浇油呀,描述如下: 在root用户 ...
- 用过滤器Filter判断用户是否登陆
用过滤器Filter判断用户是否登陆 WEB.XML <!-- 用户session的 键 sessionKEY --> <context-param> <param- ...
- Java对象与对象引用变量的理解
Java对象及对象引用 首先定义一个简单的类: class User{ int userId; String userName; } 我们在创建对象时,通常会写: User user = new Us ...
- SPOJ:NT Games(欧拉函数)
Katniss Everdeen after participating in Hunger Games now wants to participate in NT Games (Number Th ...
- CodeForces-204E:Little Elephant and Strings (广义后缀自动机求出现次数)
The Little Elephant loves strings very much. He has an array a from n strings, consisting of lowerca ...
- Python基础第七天
一.内容 二.练习 练习1 题目:编写函数,函数执行的时间是随机的 图示: 代码: import time import random def func(): s = 1 l = [] for i i ...
- openwrt 设置samba服务器与pc共享文件
1,安装samba36-server和luci-app-samba opkg install samba36-server luci-app-samba Openwrt的samba配置是先读取/etc ...