文档章节

在Tomcat环境下使用socket通信

zhangwenwen
 zhangwenwen
发布于 2015/11/22 18:08
字数 843
阅读 5868
收藏 8

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

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

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

  2. 将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中配置:

<servlet>
    <servlet-name>socketdemo</servlet-name>
    <servlet-class>SocketServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>socketdemo</servlet-name>
    <url-pattern>/demo</url-pattern>
</servlet-mapping>

        但是在启动时候却因为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进行访问:


© 著作权归作者所有

zhangwenwen
粉丝 6
博文 31
码字总数 22973
作品 0
西安
其他
私信 提问
加载中

评论(2)

zhangwenwen
zhangwenwen 博主

引用来自“颖辉小居”的评论

请问关闭tomcat时怎么同时关闭serverSocket。你好 我也遇到一个这样的项目,除了使用SSH框架向APP提供服务之外,还要通过TCP和C++的一台服务器交互。要针对客户端各种不同的请求来处理业务,同时有APP向服务端发送某个请求,服务端处理业务以后还要发送消息给C++客户端。消息格式是自定义的{字节长度,消息类型,消息体json} 我对socket比较初级,一点头绪都没有。请问该怎么实现呢?我可以加你QQ请教吗,我的qq86257167.静待答复
socket本是web的一个子线程,在关闭tomcat的时候,socket会跟着关闭。我当时测试过,当关闭tomcat的时候,socket监听的是不被占用着的。
颖辉小居
颖辉小居
请问关闭tomcat时怎么同时关闭serverSocket。你好 我也遇到一个这样的项目,除了使用SSH框架向APP提供服务之外,还要通过TCP和C++的一台服务器交互。要针对客户端各种不同的请求来处理业务,同时有APP向服务端发送某个请求,服务端处理业务以后还要发送消息给C++客户端。消息格式是自定义的{字节长度,消息类型,消息体json} 我对socket比较初级,一点头绪都没有。请问该怎么实现呢?我可以加你QQ请教吗,我的qq86257167.静待答复
socket本地测试通过,打成jar包放到服务器上部分数据不能通信

我先描述下项目:一个客户端(Android)、一个司机端(Adroid)、一个服务端(Java Socket),客户端和司机端连接服务端,保持长连接,通过业务完成通信。 (1)当客户端和司机端连接服务端本地电脑...

书堂
2015/06/18
906
2
Tomcat的性能与最大并发(1000)

当一个进程有 500 个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。 当某个应用拥有 250 个以上并发的...

搬砖小哥
2017/11/01
96
0
tomcat的性能与最大并发(1000)

当一个进程有 500 个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。 当某个应用拥有 250 个以上并发的...

JasonO
2016/03/02
498
0
集群RPC通信

RPC即远程过程调用,它的提出旨在消除通信细节、屏蔽繁杂且易错的底层网络通信操作,像调用本地服务一般地调用远程服务,让业务开发者更多关注业务开发而不必考虑网络、硬件、系统的异构复杂...

wangyangzhizhou
2015/11/20
0
0
集群RPC通信怎么做

RPC RPC即远程过程调用,它的提出旨在消除通信细节、屏蔽繁杂且易错的底层网络通信操作,像调用本地服务一般地调用远程服务,让业务开发者更多关注业务开发而不必考虑网络、硬件、系统的异构...

超人汪小建
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开发中常用的正则表达式

为了能够更好地理解如何在C#环境中使用正则表达式,这里整理了一些常用的正则表达式: 罗马数字: string p1 = "^m*(d?c{0,3}|c[dm])" + "(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$"; string t1 =......

木庄
12分钟前
3
0
【.NET程序打包】VS2019使用Installer Projects打包

C#—使用Installer Projects打包桌面应用程序 前言 打包桌面应用程序实在是一个不常使用的东西,偶尔使用起来经常会忘东忘西的耽误时间,因此,这篇文章多以图片记录过程,也是用于备忘。 下...

_Somuns
16分钟前
2
0
自定义注解,使用动态代理解决网站的字符集编码问题

第1章设置环境 安装操作系统,安装备份(镜像): JDK: 设置环境变量Eclipse:解压即可 Eclipse自身解压目录不包括中文 代码工作空间目录不包括中文Tomcat:解压不要包含中文目录M...

蓝来杯往
21分钟前
2
0
Solr中的字段类型field type

Solr含有多种字段类型,可用的字段类型基本都定义在了包org.apache.solr.schema中,列举如下: 类 说明 BinaryField 二进制数据 BoolField 布尔值,其中’t’/’T’/’1’都是true Collatio...

gantaos
35分钟前
3
0
《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
41分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部