一个最典型的多线程的应用,主线程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和多线程的应用程序间通信技术的研究》一文深入探讨了在不同程序之间采用SOCKET和多线程技术进行数据通信的方法。本文将详细解析标题和描述中的核心知识点,包括SOCKET和多线程的基本原理,以及它们在...
### Socket和多线程在视频传输中的应用 #### 一、引言 随着计算机网络技术和多媒体技术的迅速发展,视频应用系统(例如视频电话、视频监控等)的应用范围日益广泛。如何有效地在网络上传输视频信息成为了研究的...
在IT领域,网络编程是不可或缺的一部分,而Socket和多线程技术则是构建网络应用程序的核心工具。本示例项目"SOCKET+多线程例子"旨在帮助初学者掌握这两个关键概念,以便于创建高效的网络通信应用。 首先,让我们...
Socket编程和多线程技术是计算机网络编程中的两个重要概念,尤其在开发实时通信应用,如聊天室时,它们起着关键作用。本项目“Socket和多线程的聊天室”是一个基于控制台的简单聊天应用程序,允许用户通过命令行进行...
在.NET平台上,SuperSocket以其易于扩展和高度定制化的特性,成为了Socket多线程编程的一个优选方案。 **一、SuperSocket的核心特性** 1. **多线程支持**:SuperSocket采用了多线程模型来处理客户端的连接,确保了...
文件列表中的"server"可能包含了实现上述功能的源代码,包括Socket的创建、多线程的创建和管理,以及与客户端的交互逻辑。对这个程序进行深入学习和分析,可以帮助你理解多线程Socket服务端的工作原理,并为构建自己...
多线程是现代应用程序中常见的并发执行方式,它可以提高程序的效率和响应性。在Qt中,QThread类是用于实现线程的基础,它使得开发者能够轻松地将工作负载分散到多个线程中。在这个项目中,多线程被用来处理并发的...
在Linux操作系统中,使用Socket和多线程技术可以构建一个简单的聊天室应用。Socket是网络通信的基本接口,它允许不同的进程或计算机之间进行数据交换。而多线程则可以提高程序的并发处理能力,使聊天室能同时处理多...
标题提到的"SOCKET实现多线程TCP连接源码"是一个典型的网络编程示例,它演示了如何通过Socket接口处理多个并发客户端连接,并使用多线程来保持与每个客户端的独立通信。 首先,TCP(传输控制协议)是一种面向连接的...
本篇文章将深入探讨C#中基于TCP的Socket多线程通信,包括服务端和客户端的实现。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在C#中,我们可以使用System.Net....
在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...
总之,"socket多线程例程非阻塞模式"是一个实用的编程实例,涵盖了网络通信、多线程以及异步处理的关键技术,对于学习和理解这些概念非常有价值。通过对源代码的分析和实践,开发者能够提升自己的网络编程技能,为...
值得注意的是,实际的Socket多线程应用还需要考虑错误处理、资源关闭、同步机制(如使用`BufferedReader`和`PrintWriter`进行输入输出,可能需要同步防止数据交错)等问题,这些都是描述中提到的细节问题,对新手来...
**标题与描述解析** 标题"Netty技术文档,Socket技术,多线程"指出我们要讨论的是Netty框架,它与Socket编程以及多线程技术的...通过阅读这份文档,读者可以进一步了解Netty在多线程并发编程中的最佳实践和具体应用。
总结来说,Java Socket多线程是构建高并发网络服务的关键技术。通过合理地设计和实现,可以有效地提升服务器的并发处理能力,为用户提供更高效的服务。在实际项目中,应根据具体需求选择适合的线程模型,例如线程池...
学习这个框架可以帮助理解如何在实际应用中有效地管理和使用Socket连接,以及如何通过多线程和线程池优化并发性能。通过阅读和分析源码,可以深入理解这些概念,并提升网络编程和并发处理的能力。
此外,对于多线程应用,合理的设计和同步策略至关重要,以避免死锁和其他并发问题。 总结来说,"socket通信 多线程实现"涉及到的知识点包括: 1. Socket编程的基本原理和步骤。 2. C++的Berkeley Sockets API的使用...
Socket通讯与多线程处理是计算机网络编程中的重要概念,主要应用于分布式系统、服务器开发以及实时数据传输等场景。在本实例中,我们将探讨如何利用Socket进行通信,并结合多线程技术来提升程序的并发处理能力。 ...
总的来说,Windows Socket编程与多线程的结合是构建高性能网络服务的核心技术之一,对于想要深入理解和开发网络应用的IT从业者来说,这是不可或缺的知识点。通过不断地学习和实践,开发者能够更好地理解和驾驭这一...