一个最典型的多线程的应用,主线程EventReceiver起了一个针对某个端口的Server Socket,然后轮训接受客户端socket的连接请求并接收和处理数据,由于接收和处理数据是相对复杂和耗时的一个事情,所以最好的办法就是主线程在socket连接建立完成之后就启动一个专门负责接收和处理的数据的线程,这样就可以做到在连接数量比较大的情况下,以多线程的方式并行快速处理数据。下面是主线程EventReceiver和处理数据的线程ClientEventReceiver。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.log4j.Logger;
public class EventReceiver extends Thread {
private int port = 3809;
private final static Logger logger = Logger.getLogger(EventReceiver.class);
public EventReceiver() {
}
public EventReceiver(int port) {
this.port = port;
}
public void run() {
logger.info("Main event receiver is starting at port: " + port);
try {
ServerSocket socket = new ServerSocket(port);
while(true) {
try {
Socket clientSocket = socket.accept();
logger.info("receive a client from " + clientSocket.getRemoteSocketAddress());
new ClientEventReceiver(clientSocket).start();
} catch (IOException e) {
logger.error("", e);
}
}
} catch (IOException e) {
logger.error("" ,e);
}
}
}
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import org.apache.log4j.Logger;
import com.zznode.inms.alarm.process.Setting;
import com.zznode.inms.unification.collector.util.IpScope;
public class ClientEventReceiver extends Thread {
private Socket socket;
private String remoteIp = null;
private static final Logger logger = Logger
.getLogger(ClientEventReceiver.class);
public ClientEventReceiver(Socket socket) {
super();
this.socket = socket;
this.remoteIp = IpScope.getIpStr(socket.getInetAddress().getAddress());
}
public void run() {
logger.info("Session to " + remoteIp + " is starting...");
try {
InputStream in = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
byte[] aAlarmByte = new byte[Setting.ALARM_READ_ONCE];
byte aByte = (byte) bis.read();
int i = 0;
StringBuffer alarmSb = new StringBuffer();
while (aByte != -1) {
if (aByte != 0) {
aAlarmByte[i++] = aByte;
if (i >= Setting.ALARM_READ_ONCE) {
// logger.error("Error: the received alarm's size is bigger than the lengh defined: " + Setting.ALARM_MAX_LENGH);
alarmSb.append(new String(aAlarmByte, 0, i, "UTF-8"));
i = 0;
}
} else {
alarmSb.append(new String(aAlarmByte, 0, i, "UTF-8"));
i = 0;
String aAlarmStr = alarmSb.toString();
alarmSb = new StringBuffer();
AlarmDecoder.getInstance().addAlarm(aAlarmStr, remoteIp);
}
aByte = (byte) bis.read();
}
} catch (UnsupportedEncodingException e) {
logger.error("", e);
} catch (IOException e) {
logger.error("", e);
} finally {
logger.info("Session to " + remoteIp + "stoped. ");
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
基于SOCKET和多线程的应用程序间通信技术的研究.pdf
Socket和多线程在视频传输中的应用
是一个socket长连接和短连接框架其中包括多线程,线程池的创立,由于jar包太大所以没拷上来,可以作为学习应用.
在Linux下基于socket多线程并发通信的编程中,多线程并发具有的优势是可以减少CPU被大量占用,提高编程的效率和应用程序响应的速度,促进系统的程序结构进一步优化。在合理运用并发技术的情况下,可以同时完成多个...
socket 多线程 delphi socket 多线程 delphi
随着分布式系统的兴起!并发多任务技术越来越重要" 在现有的基于 多线程的操作系统上开发并发多任务程序已成为程序设计的热点" %&’()* 具有强大的开发网络应用程序的功能...%&’()* 的多线程技术在+,-.&/ 编程中的应用
使得任何两台安装了TCP 协议软件和实现了Socket 规范的计算机之间的通信成为可能,Socket 接口是TCP/IP 网络最为通用的应用接口,也是在Internet 上进行网络程序应用开发最通用的API[1],本文介绍了Socket通信的基本...
基于Java+socket实现多线程聊天室(控制台版+高分课设)已获导师指导并通过的95分的高分期末大作业项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 该系统功能完善、界面美观、操作简单...
运用了Socket,Dns,多线程的网络技术,可以打开多个客户端应用程序和服务端相应(上限20,可扩展)。此程序要求用户输入一个字符串,服务器返回大写的字符串给用户,用户输入“exit”退出登录,服务端有相应的显示。 ...
socket的多线程应用,对多线程跟socket的学习还是不错的,花了一天时间,嘿嘿
C#多线程与Socket编程 在程序设计中,涉及数据存储和数据交换的时候,不管是B/S还是C/S模式 ,都有这样一个概念:数据库服务器。这要求一台性能和配置都比较好的主机作为服务器, 以满足数目众多的客户端进行频繁...
本项目实现了在Linux下简单的socket网络聊天室。...在技术实现上,本项目主要使用网络套接字socket和多线程技术在网络中的应用。本项目经gcc编译器和gdb调试器调试成功,可以在局域网的网络聊天中使用
写的多线程socket下,传输图片和下载图片的应用demo,部署后直接运行
网页式教程,学习方便,大量经典实例讲解。IBM官方教程,可遇不可求哦。
Java多线程机制及其在socket编程中的应用
我们介绍了 ServerSocket 和 Socket 的使用,并使用多线程编程来处理来自客户端的连接请求。我们的示例代码展示了如何使用 HTTP 协议来与客户端进行通信。这个简单的 WEB 服务器可以用来测试和学习网络编程的基础...
"C# Socket多线程编程实例" 本文主要介绍了C#语言在网络编程方面的应用,特别是套接字编程的基本概念和实现原理。套接字是一种通信的基石,支持TCP/IP协议的网络通信的基本操作单元。我们可以将套接字看作不同主机...
Java多线程机制及其在socket编程中的应用.pdf
1、Swing与Socket多线程的应用示例,服务端监听某一端口,多客户端接入。 2、配置均使用properties文件,日志记录使用log4j。 3、处理线程,与发送webservice数据所用线程,均使用单例模式,使用队列处理数据。 4...