龙空技术网

用Tomcat启动ServerSocket时 会怎么样

JAVA柯尼塞克丶 176

前言:

今天小伙伴们对“java seversocket”大概比较着重,同学们都需要剖析一些“java seversocket”的相关知识。那么小编也在网络上搜集了一些关于“java seversocket””的相关内容,希望同学们能喜欢,看官们快快来了解一下吧!

服务器端代码

 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 Administrator16 *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 block63 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 Administrator11 *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 block10 e.printStackTrace();11 } 12 13 }14 15 }

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

标签: #java seversocket