java socket tomcat_在Tomcat环境下使用socket通信
最近在做一個APP的服務器端,但是APP和服務器端使用的是HTTP的通信協議,而另一方與服務器端通信卻使用的是自定義的通信協議。具體的系統(tǒng)拓撲如下:
為了完成以上的需求,一般的解決方案有兩種:
自己實現服務器端程序,利用已經實現的http jar包來實現http通信協議,同時利用socket通信來實現自己的通信協議;
將socket通信整合在tomcat中,利用tomcat來提供http通信,同時實現自己的通信協議。
對于第一種方法,所有的都需要自己來實現,需要自己進行環(huán)境的初始化,配置管理,比較麻煩。目前為了方便開發(fā),快速利用web的各種框架,采用的是第二種方法,將socket通信整合在tomcat環(huán)境下,隨著web的啟動,初始化一個socketserver來進行自定義的數據通信。
在web環(huán)境下,tomcat整合socket的主要的難處就是如何觸發(fā)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通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java喷泉编码_好程序员Java教程分
- 下一篇: 调用Django中的API时,使用Pyc