使用 ServerSocket 进行文件上传,以及用Tomcat启动ServerSocket时,会卡死解决

服务器端代码

 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 }

 

猜你喜欢

转载自www.cnblogs.com/3b2414/p/10819087.html
今日推荐