1.在我的web程序启动的时候,程序后台自动开启一个线程,监听socket端口。在项目中使用了一个监听器去开启线程类:
package cn.ccb.yn.acms.socket; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpServlet; public class MyListener extends HttpServlet implements ServletContextListener { /** * */ private static final long serialVersionUID = 1L; private ServerServiceImpl serverServiceImpl; public void contextInitialized(ServletContextEvent arg0) { if(null==serverServiceImpl){ new ServerServiceImpl().start(); } } public void contextDestroyed(ServletContextEvent arg0) { if(null!=serverServiceImpl && serverServiceImpl.isInterrupted()){ serverServiceImpl.interrupt(); } } }
下面是服务端线程类:
package cn.ccb.yn.acms.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.sql.SQLException; import java.sql.Statement; import org.springframework.stereotype.Service; @Service public class ServerServiceImpl extends Thread implements IServerService { ServerSocket serverSocket = null; Socket socket = null; BufferedReader bReader = null; PrintWriter pWriter = null; public ServerThread th = null; public void initPort(){ try { if(null==serverSocket){ serverSocket = new ServerSocket(22222); } } catch (IOException e) { if(null!=serverSocket){ try { serverSocket.close(); } catch (IOException e1) { e1.printStackTrace(); } } e.printStackTrace(); } } public void run(){ initPort(); while(true){ System.out.println("Listening Port 22222 Starting....."); try { socket = serverSocket.accept(); th = new ServerThread(socket); th.start(); sleep(1000); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 使用一个内部类去处理服务器接收到的请求 * @author yb * */ class ServerThread extends Thread { Socket sk = null; public ServerThread(Socket sk){ this.sk = sk; } public void run(){ try { pWriter = new PrintWriter(sk.getOutputStream()); bReader = new BufferedReader(new InputStreamReader(sk.getInputStream())); String line = bReader.readLine(); if(null!=line && !"".equals(line)){ saveData(line); System.out.println("从客户端来的信息:" + line); pWriter.println("你好,服务器已经收到您的信息!'" + line + "'\n"); } pWriter.flush(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String [] args) { //saveData(); //new ServerServiceImpl().start(); } /** * 开启线程 */ public String startThread(){ try { th.start(); sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return ""; } /** * 停止线程 */ @SuppressWarnings("deprecation") public String stopThread(){ th.stop(); return ""; } /** * 处理数据 * @param str * @return */ public static String saveData(String str){ try { Statement stmt = DBConnection.getOracleConn("jdbc:oracle:thin:@172.17.1.12:1521:odsbptdb", "acms", "acms").createStatement(); String sql = "insert into TEST values (1,'"+str+"')"; stmt.execute(sql); return "success"; } catch (SQLException e) { e.printStackTrace(); return "fail"; } } }
在web.xml中配置自定监听器
<listener> <listener-class>cn.ccb.yn.acms.socket.MyListener</listener-class> </listener>
客户端测试类:
package cn.ccb.yn.acms.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client extends Thread { Socket sk = null; BufferedReader reader = null; PrintWriter wtr = null; BufferedReader keyin = null; public Client() { keyin = new BufferedReader(new InputStreamReader(System.in)); try { sk = new Socket("127.0.0.1", 22222); } catch (Exception e) { e.printStackTrace(); } } public void run(){ try { System.out.println("客户端开始请求....."); reader = new BufferedReader(new InputStreamReader(sk.getInputStream())); wtr = new PrintWriter(sk.getOutputStream()); String get = keyin.readLine(); while (true) { if (get != null & get.length() > 0) { wtr.println(get); wtr.flush(); //wtr.close(); //System.out.println(get + "发送完毕"); } if (reader != null) { String line = reader.readLine(); System.out.println("从服务器来的信息:" + line); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String [] args) { new Client().start(); } }