使用 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. ...
随机推荐
- AnkhSVN介绍
AnkhSVN介绍 Posted on 2012-11-15 23:24 ArRan 阅读(3120) 评论(1) 编辑 收藏 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS ...
- udhcp源码详解(一)之文件组织结构(dhcp server) --转
udhcp目录下有十几个源文件,一个源文件相对应一个模块,完成一系列相关的功能,例如在static_leases.c主要针对static_lease链表增删查找等操作. dhcpd.c—— 整个d ...
- vmware10上安装mac os 10.9
来源地址:http://dtbuluo.com/blog/archives/350 序言: 前几天跟朋友开玩笑说,要不我们一起来学习一下swift编程语言吧~我们就抱着玩玩的态度,没有想过要做出什么优 ...
- dotnet new 命令
如果想知道这个命令的详细用法,可以在打完命令之后,在输入一个" --help"即可 $ dotnet new --help.NET Initializer Usage: dotne ...
- WAMP的端口修改
wamp集成了开源的利器mysql+apache+php,真的是有越来越火的趋势了,可是有些人,安装php的集成开发环境WAMP的时候,出现端口被占用了,无法连接服务器的时候, 这时,如果要修改WAM ...
- javaScript定义函数的三种方式&变量的作用域
一.函数定义 方式1.普通方式定义函数 function 函数名(參数n){ 函数体 } function add(a,b){ return a+b; } 方式2.直接量定义函数 var 函数名=fu ...
- XMU 1050 Diffuse Secret 【最短路】
1050: Diffuse Secret Time Limit: 500 MS Memory Limit: 64 MBSubmit: 10 Solved: 8[Submit][Status][We ...
- URAL1099 Work Scheduling —— 一般图匹配带花树
题目链接:https://vjudge.net/problem/URAL-1099 1099. Work Scheduling Time limit: 0.5 secondMemory limit: ...
- ubuntu1.8安装lnmp失败
兴致冲冲的安装好ubuntu1.8. 想安装lnmp,结果失败,失败,失败. 一遍由一遍,很痛苦. 每一遍都要半个小时,甚至更久. 等来的就是失败. 看日志也看不出头绪来. ============= ...
- eclipse自动创建项目出错Cannot change version of project facet Dynamic Web Module to 2.3.
Cannot change version of project facet Dynamic Web Module to 2.3. step1:修改properties step2:修改web.xml ...