java socket 与  ServerSocket


    某次写一个智能设备上传数据,数据每次三秒一条,然后使用c++写的客户端,没有对应java的源码,只能自己手写了,期间各种问题现在总结下


    首先用的框架是ssh(我想用那个应该是没什么差别),因为是添加到web项目中的,so我想到的是tomcat启动的时候启动,于是首先必须要有的是后台程序,否则tomcat无法启动成功;话不多说,上源码。。。


    web.xml中我最后选用的是listener  监听还有一种是servlet  应该都可以 我最后选择的是 listener  

 <listener> 

    <description>Socket服务随web启动而启动</description> 

    <listener-class>com.controller.ServerSocketListener</listener-class>

 </listener>或者

<!-- <servlet>

    <servlet-name>SocketServlet</servlet-name>

    <servlet-class>com.controller.SocketServlet</servlet-class>

    <load-on-startup>13</load-on-startup>

  </servlet> -->

    在监听器中启动多线程,后台进程

    public class ServerSocketListener implements ServletContextListener {

    

    private ServerThread socketThread;

       

        /**

         * 初始化当Servlet容器启动Web应用时调用该方法

         */

        public void contextInitialized(ServletContextEvent arg0) {

        if (null == socketThread) {

               socketThread = new ServerThread();

               socketThread.setDaemon(true);

           }

        System.out.println("启动**********");

        socketThread.start();

        }

    

    

    @Override

    public void contextDestroyed(ServletContextEvent sce) {

    // TODO Auto-generated method stub

    

    }

    }

    

    处理socket

    

public class ServerThread extends Thread{

private ServerSocket serverSocket = null;

public ServerThread() {

try {

if (null == serverSocket) {

this.serverSocket = new ServerSocket(5858);

}

} catch (IOException e) {

e.printStackTrace();

}

}

public void run() {

while (true) {

/ 调用accept()方法开始监听,等待客户端的连接

// 启动线程 此处多线程是因为有多个数据上传,目前想到的是再次启动多线程,实验可用

try {

Socket socket = serverSocket.accept();

new Thread(new Task(socket)).start();  

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

static class Task implements Runnable {

private Socket socket;


/**

* 构造函数

*/

public Task(Socket socket) {

this.socket = socket;

}


// 线程执行的操作,响应客户端的请求

public void run() {

InputStream is = null;

DataInputStream dis = null;

try {

         //必须设置线程超时时长,否则会导致cup过高或者连接通道无法关闭等问题

socket.setSoTimeout(3 * 1000);

// 获取输入流,并读取客户端信息

is = socket.getInputStream();

dis = new DataInputStream(is);

Byte info = null;

if (dis != null) {

while ((info = (byte) dis.readByte()) != null) {// 循环读取客户端的信息

System.out.println(info +"数据======");

}


}


socket.shutdownInput();// 关闭输入流

// 获取输出流,响应客户端的请求


} catch (IOException e) {

// TODO Auto-generated catch block

logger.error("解析信息出错!");

e.printStackTrace();

} finally {

// 关闭资源

try {

/*

* if (isr != null) isr.close();

*/

if (is != null)

is.close();

if (socket != null)

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}


}

}