java socket tomcat_在Tomcat环境下使用socket通信

本文介绍了在Tomcat环境下整合Socket通信的解决方案,通过创建一个SocketServlet,并在Servlet的init方法中启动一个新的线程来运行SocketServer,避免阻塞Servlet的初始化。详细过程包括SocketServer的创建、在web.xml中的配置以及解决启动问题的方法。
摘要由CSDN通过智能技术生成

最近在做一个APP的服务器端,但是APP和服务器端使用的是HTTP的通信协议,而另一方与服务器端通信却使用的是自定义的通信协议。具体的系统拓扑如下:

3e80ed0626f5a947c88118b0fcace14d.png

为了完成以上的需求,一般的解决方案有两种:

自己实现服务器端程序,利用已经实现的http jar包来实现http通信协议,同时利用socket通信来实现自己的通信协议;

将socket通信整合在tomcat中,利用tomcat来提供http通信,同时实现自己的通信协议。

对于第一种方法,所有的都需要自己来实现,需要自己进行环境的初始化,配置管理,比较麻烦。目前为了方便开发,快速利用web的各种框架,采用的是第二种方法,将socket通信整合在tomcat环境下,随着web的启动,初始化一个socketserver来进行自定义的数据通信。

在web环境下,tomcat整合socket的主要的难处就是如何触发socket服务器的初始化,等待接受来自客户端的连接,且socket服务器的初始化应该只初始化一次。在web启动的时候,toncat会加载context-param -> listener -> filter -> servlet,所以就可以在这些类中来初始化socket服务来进行通信。于是就新建一个SocketServlet并在

public void init(ServletConfig config) throws ServletException

方法中初始化一个ECHO Server的SocketServer来进行通信

// TODO Auto-generated method stub

System.out.println("this is the socket program ----zhangwenwen");

try {

ServerSocket serverSocket=new ServerSocket(8191);

socket=serverSocket.accept();

InputStream inputStream=socket.getInputStream();

OutputStream outputStream=socket.getOutputStream();

Scanner in=new Scanner(inputStream);

PrintWriter printWriter=new PrintWriter(outputStream);

printWriter.write("Hello Enter BYE to exit!");

boolean done=false;

while(!done&&in.hasNextLine()){

String line=in.nextLine();

System.out.println(line);

printWriter.println("ECHO:"+line);

printWriter.flush();

if (line.trim().equals("BYE")) {

done=true;

}

}

in.close();

inputStream.close();

outputStream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

在web.xml中配置:

socketdemo

SocketServlet

1

socketdemo

/demo

但是在启动时候却因为SocketServer一直在运行,Init方法运行不能返回,从而ServletSocket不能运行结束,tomcat最后会因为启动失败而退出。

因而,现在为了解决这个问题,于是就将SocketServer封装在一个线程中

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

import javax.servlet.annotation.WebFilter;

import sun.print.resources.serviceui;

public class SocketDemo extends Thread {

private static Socket socket=null;

public static Socket getSocket() {

return socket;

}

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("this is the socket program ----zhangwenwen");

try {

ServerSocket serverSocket=new ServerSocket(8191);

socket=serverSocket.accept();

InputStream inputStream=socket.getInputStream();

OutputStream outputStream=socket.getOutputStream();

Scanner in=new Scanner(inputStream);

PrintWriter printWriter=new PrintWriter(outputStream);

printWriter.write("Hello Enter BYE to exit!\n");

printWriter.flush();

boolean done=false;

while(!done&&in.hasNextLine()){

String line=in.nextLine();

System.out.println(line);

printWriter.println("ECHO:"+line);

printWriter.flush();

if (line.trim().equals("BYE")) {

done=true;

}

}

in.close();

inputStream.close();

outputStream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

然后在Init方法里面在启动一个线程来初始化SocketServer:

/**

* @see Servlet#init(ServletConfig)

*/

public void init(ServletConfig config) throws ServletException {

SocketDemo socketDemo=new SocketDemo();

socketDemo.start();

this.socket=socketDemo.getSocket();

}

这样就实现了在tomcat下进行,在控制台下用telnet进行访问:

8d4a07f86e3609f819012b59cb3c45a5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值