Java]Socket和ServerSocket服务器端接受数据

本文介绍如何将Java Socket服务集成到Tomcat中,通过监听器在Web应用启动时自动启动Socket服务。详细解释了使用ServerSocket接收客户端连接,并通过多线程处理每个连接请求的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();

}

}


}

}

    


 

本文出自 “摘星” 博客,请务必保留此出处http://dx969208484.blog.51cto.com/10422053/1893182

转载于:https://my.oschina.net/u/3110558/blog/863528

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值