博客列表 >用Tomcat启动ServerSocket时 会怎么样

用Tomcat启动ServerSocket时 会怎么样

Coco
Coco原创
2021年12月12日 21:53:19396浏览

  服务器端代码

  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:\?dTest1\" + 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:\?dTest\\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

  2   serverSocket

  3 com.xxx.testtocol.UploadTest.StartServer

  4 3

  5

  6

  7 serverSocket

  8 /TCPServer/*

  9

  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();

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议