Socket 代码收藏
class SocketHelper
{
public delegate void Uplistbox(string txt);
public Uplistbox uplb; //更新listbox委托变量
protected static readonly ILog logger = LogManager.GetLogger(typeof(TCPSocketServer2));
private ManualResetEvent allDone = new ManualResetEvent(false); //线程控制
protected Hashtable m_workerSocketHt = Hashtable.Synchronized(new Hashtable());//保存客户端socket哈希表
public AsyncCallback asyncCallBack; //声明异步完成时调用的方法.
private Socket m_mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//主通信Socket
public bool isExit = false;//全局控制SOCKET启动和关闭
private long m_clientCount = 0L;//记录客户端数量
/// <summary>
/// 发送消息
/// </summary>
/// <param name="buffer">需要发送的字节</param>
public void Send(byte[] buffer)
{
try
{
//目标地址
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234);
//发送通信socket
Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sk.Connect(ip);//连接
sk.Send(buffer);//发送
SocketUser su = new SocketUser();
su.CurrentSocket = sk;
su.DataBuffer = buffer;
//异步接收
asyncCallBack = new AsyncCallback(OnDataReceived);
sk.BeginReceive(su.DataBuffer, 0, su.DataBuffer.Length, SocketFlags.None, asyncCallBack, su);
}
catch (Exception ex)
{
string msg = ex.ToString() + " " + DateTime.Now.ToString();
uplb(msg);
logger.Debug(msg);
}
}
/// <summary>
/// 发送消息[重载]
/// </summary>
/// <param name="SocketUser">需要发送的SocketUser对象</param>
/// <param name="buffer">需要发送的字节</param>
public void Send(SocketUser su, byte[] buffer)
{
try
{
//目标地址
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234);
//发送通信socket
su.CurrentSocket.Connect(ip);//连接
su.CurrentSocket.Send(buffer);//发送
su.DataBuffer = buffer;
//异步接收
asyncCallBack = new AsyncCallback(OnDataReceived);
su.CurrentSocket.BeginReceive(su.DataBuffer, 0, su.DataBuffer.Length, SocketFlags.None, asyncCallBack, su);
}
catch (Exception ex)
{
string msg = ex.ToString() + " " + DateTime.Now.ToString();
uplb(msg);
logger.Debug(msg);
}
}
/// <summary>
/// 建立监听连接
/// </summary>
/// <param name="port">监听的端口号</param>
private void AcceptConnection(object port)
{
try
{
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, (int)port);
//绑定地址
m_mainSocket.Bind(ipLocal);
//开始监听
m_mainSocket.Listen(10000);
while (isExit == false)
{
try
{
allDone.Reset(); //线程阻塞
logger.Debug("TcpListener启动成功: " + ipLocal.Address.ToString() + "," + ipLocal.Port.ToString());
//接收异步连接并创建新的socket对象.
m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), m_mainSocket);
allDone.WaitOne();
}
catch (SocketException sf)
{
logger.Error("客户连接请求异常" + sf.ToString());
}
catch (Exception f)
{
logger.Error("客户连接请求异常" + "错误信息:" + f.Message);
break;
}
}
}
catch (SocketException se)
{
logger.Error("TcpListener启动失败" + se.ToString() + "错误号:" + se.ErrorCode.ToString());
}
catch (Exception e)
{
logger.Error("TcpListener错误" + "错误信息:" + e.Message);
}
}
/// <summary>
/// 开始监听
/// </summary>
/// <param name="Port">监听的端口</param>
/// <param name="buffer">发送的字节</param>
public bool StartListening(int Port, params byte[] buffer)
{
if (Port == 0)
{
logger.Debug("TcpListener未启动,请指定监听的端口号.");
return false;
}
// 创建监听socket
Thread AcceptTh = new Thread(new ThreadStart(delegate
{
AcceptConnection(Port);
}));
AcceptTh.Start();
Thread sendth = new Thread(new ThreadStart(delegate
{
Send(buffer);
}));
sendth.Start();
logger.Debug("启动TCP监听,端口: " + Port);
return true;
}
}
}
Socket 代码收藏的更多相关文章
- Netty实现的一个异步Socket代码
本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio; import com.google.common.util.concurrent.ThreadF ...
- 代码收藏系列--php--生成简短唯一订单号(转载)
代码收藏系列--php--生成简短唯一订单号 /** * 生成商家交易单号 * <br />特点:不重复 * <br />示例: * <br />普通付款:arra ...
- 代码收藏系列--php--生成简短唯一订单号
/** * 生成商家交易单号 * <br />特点:不重复 * <br />示例: * <br />普通付款:array('shop_id'=>1,'prod ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例
SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html 分享到:8 发布时 ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- 代码收藏系列--jquery--筛选器、事件绑定技巧
Jquery筛选器的一些常用技巧,比如过滤属性等 /* 过滤获取没有含data-xsui-grid-colspan的节点 */$(this).find('.xsui-grid-cell:not([da ...
- 代码收藏系列--javascript--日期函数
/** * 获取当前时间的简短函数 * @returns {String} * @@example getTimeStamp() 结果是:2017-07-12 09:21:30 */ function ...
- 代码收藏系列--javascript--移动端技巧
JS判断是否是手机端访问: var is_mobi = navigator.userAgent.toLowerCase().match(/(ipod|iphone|android|coolpad|mm ...
- 代码收藏系列--mysql--创建数据库、数据表、函数、存储过程命令
创建mysql数据库 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_general_c ...
随机推荐
- Redis Cluster 伪集群的搭建
简介 为何要搭建Redis集群?Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB ...
- 数据库开源框架ormlite
今天听说了ORM框架ORMLITE,特地去了解了一下. 该框架可以使用注解方式来生成数据库表,还封装了常用的数据库操作. 类似J2EE的HIBERNATE框架对数据库的处理. 省去了书写建表语句的麻烦 ...
- day17 14.dao模式介绍
Web的三层架构,不是MVC,Web层,Service层,DAO层. 之前玩的JSP Servlet JavaBean那是MVC模式,那玩意只是表现层的东西. 转账汇款的例子. 说了这么多有啥用啊,一 ...
- Eclipse安装Web/JavaEE插件、Eclipse编写HTML代码
1 Eclipse没有Web插件和JavaEE插件咋整 1.1 在Eclipse中菜单help选项中选择install new software选项 1.2 在work with 栏中输入 http: ...
- 基于IFC标准的4DBIM可视化平台
- JavaWeb_增强for循环
引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需要先获得数组的长度或集合的迭代器,比较麻烦. JDK5中定义了一种新的语法----增强for循环,以简化此类操作.增强for ...
- jQuery选择器和选取方法.RP
我们已经使用了带有简单Css选择器的jQuery选取函数:$().现在是时候深入了解jQuery选择器语法,以及一些提取和扩充选中元素集的方法了. 一.jQuery选择器 在CSS3选择器标淮草案定义 ...
- 带有通配符的字符串匹配算法-C/C++
日前某君给我出了这样一道题目:两个字符串,一个是普通字符串,另一个含有*和?通配符,*代表零个到多个任意字符,?代表一个任意字符,通配符可能多次出现.写一个算法,比较两个字符串是否相等. 我花了四个小 ...
- c# get set 理解
- Android proguard代码混淆
为什么要代码混淆? Android的安装文件是apk格式.APK是AndroidPackage的缩写.是由android sdk编译的工程打包生成的安装程序文件. Apk其实是zip文件,但是后缀名被 ...