使用 ServerSocket 进行文件上传,以及用Tomcat…
2019-05-08 07:29:56来源:博客园 阅读 ()
服务器端代码
1 import java.io.BufferedOutputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.net.InetAddress; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 import javax.servlet.http.HttpServlet; 11 12 /** 13 * 文件上传多线程版本,服务器端 14 * 15 * @author Administrator 16 * 17 */ 18 public class TCPServer extends HttpServlet { 19 20 public void upload() throws Exception { 21 22 // 创建服务器,等待客户端连接 23 ServerSocket serverSocket = new ServerSocket(8880); 24 System.out.println("=====================服务器端已启动,等待客户端连接===================="); 25 // 实现多个客户端连接服务器的操作 26 while (true) { 27 final Socket clientSocket = serverSocket.accept(); 28 // 启动线程 29 new Thread() { 30 public void run() { 31 try { 32 // 显示哪个客户端连接上了服务器 33 // 得到ip地址对象 34 InetAddress ipAddress = clientSocket.getInetAddress(); 35 // 得到ip 地址字符串 36 String ip = ipAddress.getHostAddress(); 37 System.out.println("客户端IP:" + ip); 38 // 获取Socket输入流 39 InputStream in = clientSocket.getInputStream(); 40 // 创建目的地的字节输出流 41 BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream( 42 "D:\\uploadTest1\\" + ip + "(" + System.currentTimeMillis() + ").png")); 43 // 把Socket输入流中的数据,写入目的地的字节输出流中 44 byte[] buffer = new byte[1024]; 45 int len = -1; 46 while ((len = in.read(buffer)) != -1) { 47 // 写入目的地的字节输出流中 48 fileOut.write(buffer, 0, len); 49 } 50 51 // ====================反馈信息==================== 52 // 获取Socket的输出流,作用:写反馈信息给客户端 53 OutputStream out = clientSocket.getOutputStream(); 54 // 写反馈信息给客户端 55 out.write("图片上传成功".getBytes()); 56 // 关闭流 57 out.close(); 58 fileOut.close(); 59 in.close(); 60 clientSocket.close(); 61 } catch (IOException e) { 62 // TODO Auto-generated catch block 63 e.printStackTrace(); 64 } 65 } 66 }.start(); 67 } 68 } 69 70 }
客户端代码
1 import java.io.BufferedInputStream; 2 import java.io.FileInputStream; 3 import java.io.InputStream; 4 import java.io.OutputStream; 5 import java.net.Socket; 6 7 /** 8 * 文件上传客户端 9 * 10 * @author Administrator 11 * 12 */ 13 public class TCPClient { 14 15 public static void upload() throws Exception { 16 17 // 创建客户端Socket,链接服务器 18 Socket socket = new Socket("IP", 8880); 19 System.out.println("====================客户端已连接===================="); 20 // 获取Socket流中的输出流,功能:用来把数据写到服务器 21 OutputStream out = socket.getOutputStream(); 22 // 创建字节输入流,功能:用来读取数据源(图片)的字节 23 BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("D:\\uploadTest\\img.png")); 24 // 把图片数据写到Socket的输出流中(把数据传给服务器) 25 byte[] buffer = new byte[1024]; 26 int len = -1; 27 // read返回值是读入缓冲区的字节总数 28 while ((len = fileIn.read(buffer)) != -1) { 29 // 把数据写到Socket的输出流中 30 out.write(buffer, 0, len); 31 } 32 // 客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器 33 socket.shutdownOutput(); 34 35 // ====================反馈信息==================== 36 // 获取Socket的输入流,作用:读取反馈信息 37 InputStream in = socket.getInputStream(); 38 // 读反馈信息 39 byte[] info = new byte[1024]; 40 // 把反馈信息存储到info数组中,并记录字节个数 41 int length = in.read(info); 42 // 显示反馈结果 43 System.out.println(new String(info, 0, length)); 44 // 关闭流 45 in.close(); 46 fileIn.close(); 47 out.close(); 48 socket.close(); 49 } 50 51 }
测试代码
1 public class Test { 2 3 public static void main(String[] args) throws Exception{ 4 5 TCPClient.upload(); 6 7 } 8 9 }
遇到的问题:
在用Tomcat启动ServerSocket时,会卡死,解决办法:
1,在 web.xml 中配置
1 <servlet> 2 <servlet-name>serverSocket</servlet-name> 3 <servlet-class>com.xxx.test.protocol.UploadTest.StartServer</servlet-class> 4 <load-on-startup>3</load-on-startup> 5 </servlet> 6 <servlet-mapping> 7 <servlet-name>serverSocket</servlet-name> 8 <url-pattern>/TCPServer/*</url-pattern> 9 </servlet-mapping>
2,
1 import javax.servlet.ServletException; 2 import javax.servlet.http.HttpServlet; 3 4 public class StartServer extends HttpServlet { 5 6 public void init() throws ServletException { 7 8 Thread s = new StartThread(); 9 s.setDaemon(true);// 设置线程为后台线程,tomcat不会被hold,启动后依然一直监听。 10 s.start(); 11 12 } 13 14 }
3,
1 public class StartThread extends Thread { 2 3 public void run() { 4 5 try { 6 TCPServer server = new TCPServer(); 7 server.upload();// 启动开启服务,监听 8 } catch (Exception e) { 9 // TODO Auto-generated catch block 10 e.printStackTrace(); 11 } 12 13 } 14 15 }
原文链接:https://www.cnblogs.com/3b2414/p/10819087.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 聊聊 OAuth 2.0 的 token expire_in 使用 2020-06-08
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- 学习笔记之方法引用 2020-06-06
- idea使用小技巧(一) 2020-06-05
- 用斗地主的实例学会使用java Collections工具类 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash