欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用Tomcat启动ServerSocket时 会怎么样

程序员文章站 2022-03-27 09:56:11
...

  服务器端代码

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