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

最近在做一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品设计 产品经理 喜欢的网站

1 Markman http://www.zi-han.net/tools/319.html 下载地址1: 链接: http://pan.baidu.com/s/1jGKdofO 密码: 8lbh 下载地址2: 提示:安装前需要先安装AIR(官方下载) MarkMan下载:官方下载 2 在线原型制作 http://cdn…

安卓手机主题软件_类似主题软件下载-类似主题安卓官方版下载v2.6.6.3

类似主题app,介绍给大家,是一款可以让我们在线进行主题变幻,拥有更多特色主题风格的服务平台。有了它用户就可以体验不同机型的主题风格,不论苹果还是安卓都是支持的,喜欢的不妨来下载看看!【类似主题应用功…

python接单业余赚钱的门路_程序员业余时间怎么快速一年赚200万

阅读:2515348791​分享到有几个比较好的朋友,都是搞程序出身,典型的IT男,编程的能力相当不错,但是随着年龄的增大,家庭责任的到来,很希望搞点赚钱的外快,但是不知道做什么&#xff1…

Java 文件 IO 操作

文章目录1. File类2. RandomAccessFile类3. 流类3.1 字节流3.2 字符流3.3 管道流3.4 ByteArrayInputStream、ByteArrayOutputStream3.5 System.in、System.out3.6 打印流 PrintStream3.7 DataInputStream、DataOutputStream3.8 合并流3.9 字节流与字符流的转换3.10 IO包类层次关…

java dsp_GitHub - Onemeaning/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...

JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示感谢。…

简单banner制作

简单做了一个banner,效果不是很好,主要温习了蒙版知识和滤镜的使用,其中使用(图像 > 调整 > 照片滤镜, 可以让图片融合得更协调,另外图片上添加斜线做背景,这些小技巧在做banner时,能打造…

苹果11怎么录屏_苹果11怎么设置骚扰电话号码

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。系统版本为,苹果11设置拦截骚扰电话的方法如下:1、首先打开手机设置,找到【勿扰模式】;2、将勿扰模式开启后,点击下方【允…

python序列符号_初识Python(4)__Python序列

序列序列包含:字符串,列表和元组序列基本操作符索引:seq[ind] 获得下标为ind 的元素分片( [], [:], [::] ):seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合重复操作符( * ):seq * expr 序列重复expr 次连接操作符…

BigTable的开源实现:HBase数据库

learn from 从0开始学大数据(极客时间) 文章目录1. 两种数据库2. HBase 可伸缩架构3. HBase 可扩展数据模型4. HBase高性能存储1. 两种数据库 关系数据库(RDBMS)缺点: 糟糕的 海量数据处理能力、僵硬的设计约束 从 …

java toast_Android中Toast的用法简介

Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。下面用一个实例来看看如何使用Toast。1.默认效果代码Toast.makeText(getApplicationCont…

erlang lists

http://blog.csdn.net/dp0304/article/details/7590233 一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元素作为Pred函数的参数执行,结果都返回true,那么all函数返回true,否则返回false 例子: list…

流式计算的代表:Storm、Flink、Spark Streaming

learn from 从0开始学大数据(极客时间) 文章目录1. Storm2. Spark Streaming3. Flink对存储在磁盘上的数据进行大规模计算处理,大数据批处理对实时产生的大规模数据进行处理,大数据流计算 1. Storm 一些系统 业务逻辑 和 数据处…

windows7正版验证_Windows7 寿终正寝:那些一并消逝的软件你知多少?

IT服务圈儿有温度、有态度的IT自媒体平台来源:太平洋电脑网本月,一代经典操作系统微软Windows 7正式迎来了生命周期的完结。微软宣布,此后将不再为Win7提供任何形式的更新,包括安全更新、稳定性更新和功能更新;而仍在使…

python3 整除_python如何整除

Python 的除法运算符有两个:“/”表示普通除法,使用它除出来的结果与平常数学计算的结果是相同的(即除不尽时,会产生小数部分);而“//”表示整除,使用它除出来的结果只有整数部分,小数部分将会被舍弃。记住…

java implements t_Java泛型——為什么“擴展T”允許而不是“實現T”?

I wonder if there is a special reason in Java for using always "extends" rather than "implements" for defining bounds of typeparameters.我想知道在Java中是否有一個特殊的原因,因為使用總是“擴展”而不是“實現”來定義類型參數的界…

php调用webservice报错Class 'SoapClient' not found

php调用webservice报错Class SoapClient not found 原文:php调用webservice报错Class SoapClient not found php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Class SoapClient not found in E:/WebSrv/CI/system/libraries/WebService.php…

stotybord如何添加子视图_Revit软件技巧合集(建筑构件、视图处理、建筑表现、高级技巧)...

Revit软件技巧合集164套(建筑构件、视图处理、建筑表现、高级技巧)BIM技术在我国建筑行业受到了越来越多的关注,也得到了快速地发展。BIM应用软件也如雨后春笋般的涌现,随着时间的推移,revit在BIM应用中将成为设计利器,而在工程施…

ZooKeeper 保证数据一致性

learn from 从0开始学大数据(极客时间) 文章目录1. 分布式一致性原理2. Paxos 算法与 ZooKeeper 架构1. 分布式一致性原理 CAP 原理认为,一个提供数据服务的分布式系统 无法同时满足 数据一致性(Consistency)、可用性…

python使方法执行10次_Python提升程序性能的七个手段

1. 使用局部变量尽量使用局部变量代替全局变量: 便于维护, 也可以避免不必要的资源浪费使用局部变量替换模块名字空间的变量, 例如: ls os.linesep. 一方面给可以提高程序性能, 局部变量查找速度更快; 另一方面可以采用简短标识符代替冗长的模块变量, 提高可读性.2. 减少函数调…

java sftp mget_总结三种Shell脚本编程中避免SFTP输入密码的方法

最近编程中用到sftp上传文件,且需要用crontab预设定时上传事件。而sftp不同于ftp,没有提供选项如 -i 可以将密码直接编码进程序。使用sftp指令,会自动请求用户输入密码。总结一下可以避免sftp输入密码的三种方式:1. lftp方式LFTP是…