Java]Socket和ServerSocket服务器端接受数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java]Socket和ServerSocket服务器端接受数据相关的知识,希望对你有一定的参考价值。
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
以上是关于Java]Socket和ServerSocket服务器端接受数据的主要内容,如果未能解决你的问题,请参考以下文章