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

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

自己实现服务器端程序,利用已经实现的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进行访问:

java socket tomcat_在Tomcat环境下使用socket通信相关推荐

  1. 关于tomcat环境下上传大文件遇到的问题及解决办法

    转载自:http://blog.csdn.net/tqwwilliam/article/details/7108247 问题描述: 关于tomcat环境下上传大文件遇到的问题及解决办法 解决方案: 1 ...

  2. java反序列化漏洞POP查找_利用 Java 反序列化漏洞在受限环境下获取反向 Shell

    原标题:利用 Java 反序列化漏洞在受限环境下获取反向 Shell 原文链接: https://medium.com/abn-amro-red-team/java-deserialization-f ...

  3. java中HashMap在多线程环境下引起CPU100%的问题解决

    最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...

  4. 基于Tomcat环境下运行JSP文件(基础版)

    1. JSP简介 JSP:Java Server Pages.在传统的HTML文件(*htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页. 2 ...

  5. java wifidog_wifidog认证服务器家用环境下部署(java版)

    本文所讲的是基于一个java版wifidog认证服务器的开源项目,在windows环境下搭建wifidog认证服务器配合固件实现用户名密码的认证. 大致步骤如下: 一,准备 1.搭建硬件及网络环境 a ...

  6. java web shiro_javase和javaweb环境下shiro的搭建

    shiro-1 javase环境下搭建shiro 1.导入jar包 2.配置文件:存储临时文件 shiro.ini文件:存储数据,用户名,密码,角色,权限 3.代码 // 1.获取安全管理器 Fact ...

  7. java本地可以发到linux不行,java 使用 ftp 在windows环境下可以正常下载文件,在linux环境下不行...

    windows环境下使用 public static void dowmloadFtpWindos(String fileUuid, HttpServletRequest request,HttpSe ...

  8. java读取sh脚本_linux环境下java读取sh脚本并执行

    linux环境下java读取sh脚本并执行 作者: CSDN博客 更新时间:2013-09-27 11:49:16 原文链接 Process process; String cmd = "/ ...

  9. dept在Java里面_EmpDeptManager 在JavaEE环境下搭建三大框架体系实现员工的增删改查系统 Develop 261万源代码下载- www.pudn.com...

    文件名称: EmpDeptManager下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 39 KB 上传时间: 2016-07-08 下载次数: 0 提 供 者 ...

最新文章

  1. html手机端适配怎么调试,html5面试常见问题及答案:移动端布局与适配篇
  2. Python学习教程实用技法:通过公共键对字典列表排序—itemgetter
  3. sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?
  4. ABBYY FineReader 12中怎样禁用自动处理
  5. Oracle ASM Cluster File Systems (ACFS)应用指南
  6. SAP WebClient UI component模型元数据解析工具
  7. linux操作系统环境变量的配置
  8. mysql数据变化通通知机制_深入理解Notification机制
  9. java平方和和立方和3_平方和与立方和
  10. Spring Boot 集成 Memcached
  11. yum安装wget失败,替换yum源为阿里yum源并重亲安装
  12. Adobe软件注册机
  13. photoshop给照片去斑的一些办法
  14. windows git bash 设置多个php版本和composer版本
  15. 巴斯扩散模型-Bass Diffusion Model
  16. 小程序微信支付提示:商户订单号重复
  17. mysql介绍——基础知识
  18. 小学生都能读懂的区块链原理和术语介绍(故事图文)-引自《从零开始自己动手写区块链》
  19. 有没有你家?贵阳七村拟入选全省乡村旅游重点村名录
  20. 区块链革命 - 推荐序一 区块链革命:从失控说起

热门文章

  1. 数据结构探险——树篇
  2. nmcli 命令的基本使用
  3. Spring系列(六) Spring Web MVC 应用构建分析
  4. 原来你是这样的Promise
  5. http数据绑定spring mvc详解
  6. 启动列表的activity
  7. javascript “||”、“”的运用
  8. SQL Server中的数据类型详解
  9. vector深拷贝与浅拷贝使用总结
  10. Android启动后icon应用图标不能显示的可能问题