实例介绍
【实例截图】
【核心代码】
#region 说明
/* 简介:Socket通讯客户端实现网络通讯
* 功能介绍:Socket通讯客户端实现网络通讯,支持断开重连。
* socket客户端封装类的调用三步:
* 1、初始化:
* string ip="127.0.0.1";
* int port=5100;
* TCPClient_tcpClient = new TCPClient(ip,port);
*
* 2、创建委托接收数据方法并绑定(可根据需求定义),此类暂时定义了四种接收数据的委托:返回接收客户端的数据,返回客户端连接状态和监听状态,返回错误信息,返回客户端数量的委托
*
* ①申明返回接收数据的委托方法
* DelegateHelper.TcpServerReceive= 自定义方法;
*
* ②申明返回状态信息的委托方法
* DelegateHelper.TcpServerStateInfo= 自定义方法;
*
* ③申明返回错误信息的委托方法
* DelegateHelper.TcpServerErrorMsg = 自定义方法;
*
*
* 3、启动和关闭方法:
* TCPCliet.StartConnection();
* TCPCliet.StopConnection();
*/
#endregion
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SocketHelper
{
public class TCPClient
{
#region 属性
private string _serverip;
/// <summary>
/// 服务端IP
/// </summary>
public string ServerIp
{
set { _serverip = value; }
get { return _serverip; }
}
private int _serverport;
/// <summary>
/// 服务端监听端口
/// </summary>
public int ServerPort
{
set { _serverport = value; }
get { return _serverport; }
}
private TcpClient _tcpclient = null;
/// <summary>
/// TcpClient客户端
/// </summary>
public TcpClient Tcpclient
{
set { _tcpclient = value; }
get { return _tcpclient; }
}
private Thread _tcpthread = null;
/// <summary>
/// Tcp客户端连接线程
/// </summary>
public Thread Tcpthread
{
set { _tcpthread = value; }
get { return _tcpthread; }
}
private bool _isStarttcpthreading = false;
/// <summary>
/// 是否启动Tcp连接线程
/// </summary>
public bool IsStartTcpthreading
{
set { _isStarttcpthreading = value; }
get { return _isStarttcpthreading; }
}
private bool _isclosed=false;
/// <summary>
/// 连接是否关闭(用来断开重连)
/// </summary>
public bool Isclosed
{
set { _isclosed = value; }
get { return _isclosed; }
}
private int _reConnectionTime = 3000;
/// <summary>
/// 设置断开重连时间间隔单位(毫秒)(默认3000毫秒)
/// </summary>
public int ReConnectionTime {
get { return _reConnectionTime; }
set { _reConnectionTime = value; }
}
private string _receivestr;
/// <summary>
/// 接收Socket数据包 缓存字符串
/// </summary>
public string Receivestr
{
set { _receivestr = value; }
get { return _receivestr; }
}
/// <summary>
/// 重连次数
/// </summary>
private int _reConectedCount = 0;
public int ReConectedCount {
get { return _reConectedCount; }
set { _reConectedCount = value; }
}
#endregion
#region 方法
/// <summary>
/// 十六进制字字符串转为节数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static byte[] StringToHexByteArray(string s)
{
s = s.Replace(" ", "");
if ((s.Length % 2) != 0)
s = " ";
byte[] returnBytes = new byte[s.Length / 2];
for (int i = 0; i < returnBytes.Length; i )
returnBytes[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
return returnBytes;
}
/// <summary>
/// 启动连接Socket服务器
/// </summary>
public void StartConnection()
{
try
{
//Isclosed = false;
CreateTcpClient();
}
catch (Exception ex)
{
DelegateHelper.TcpClientErrorMsg("错误信息:" ex.Message);
}
}
/// <summary>
/// 创建线程连接
/// </summary>
private void CreateTcpClient()
{
if (Isclosed)
return;
//标示已启动连接,防止重复启动线程
Isclosed = true;
Tcpclient = new TcpClient();
Tcpthread = new Thread(StartTcpThread);
IsStartTcpthreading = true;
Tcpthread.Start();
}
/// <summary>
/// 线程接收Socket上传的数据
/// </summary>
private void StartTcpThread()
{
byte[] receivebyte = new byte[1024];
int bytelen;
try
{
while (IsStartTcpthreading)
#region
{
if (!Tcpclient.Connected)
{
try
{
if (ReConectedCount != 0)
{
//返回状态信息
DelegateHelper.TcpClientStateInfo(string.Format("正在第{0}次重新连接服务器... ...", ReConectedCount), EnumClass.SocketState.Reconnection);
}
else
{
//SocketStateInfo
DelegateHelper.TcpClientStateInfo("正在连接服务器... ...", EnumClass.SocketState.Connecting);
}
Tcpclient.Connect(IPAddress.Parse(ServerIp), ServerPort);
DelegateHelper.TcpClientStateInfo("已连接服务器",EnumClass.SocketState.Connected);
//Tcpclient.Client.Send(Encoding.Default.GetBytes("login"));
}
catch
{
//连接失败
ReConectedCount ;
//强制重新连接
Isclosed = false;
IsStartTcpthreading = false;
//每三秒重连一次
Thread.Sleep(ReConnectionTime);
continue;
}
}
//Tcpclient.Client.Send(Encoding.Default.GetBytes("login"));
bytelen = Tcpclient.Client.Receive(receivebyte);
// 连接断开
if (bytelen == 0)
{
//返回状态信息
DelegateHelper.TcpClientStateInfo("与服务器断开连接... ...",EnumClass.SocketState.Disconnect);
// 异常退出、强制重新连接
Isclosed = false;
ReConectedCount = 1;
IsStartTcpthreading = false;
continue;
}
Receivestr = ASCIIEncoding.Default.GetString(receivebyte, 0, bytelen);
if (Receivestr.Trim() != "")
{
//接收数据
DelegateHelper.TcpClientReceive(Receivestr);
}
}
#endregion
//此时线程将结束,人为结束,自动判断是否重连
CreateTcpClient();
}
catch (Exception ex)
{
//CreateTcpClient();
//返回错误信息
DelegateHelper.TcpClientErrorMsg("错误信息:" ex.Message);
}
}
/// <summary>
/// 断开连接
/// </summary>
public void StopConnection()
{
IsStartTcpthreading = false;
Isclosed = false;
//关闭连接
Tcpclient.Close();
Tcpthread.Interrupt();
//关闭线程
Tcpthread.Abort();
//Tcpthread = null;
DelegateHelper.TcpClientStateInfo("断开连接",EnumClass.SocketState.Disconnect);
//标示线程已关闭可以重新连接
}
/// <summary>
/// 发送Socket消息
/// </summary>
/// <param name="cmdstr"></param>
public void SendCommand(string cmdstr)
{
try
{
//byte[] _out=Encoding.GetEncoding("GBK").GetBytes(cmdstr);
byte[] _out = Encoding.Default.GetBytes(cmdstr);
Tcpclient.Client.Send(_out);
}
catch (Exception ex)
{
//返回错误信息
DelegateHelper.TcpClientErrorMsg(ex.Message);
}
}
/// <summary>
/// 发送Socket消息
/// </summary>
/// <param name="byteMsg"></param>
public void SendCommand(byte[] byteMsg)
{
try
{
Tcpclient.Client.Send(byteMsg);
}
catch (Exception ex)
{
//返回错误信息
DelegateHelper.TcpClientErrorMsg("错误信息:" ex.Message);
}
}
#endregion
#region 构造函数
/// <summary>
/// 初始化TCPClient类
/// </summary>
/// <param name="ip">服务端IP</param>
/// <param name="port">监听端口</param>
public TCPClient(string ip, int port)
{
if (DelegateHelper.TcpClientReceive == null)
{
DelegateHelper.TcpClientReceive = DelegateHelper.BaseVoid;
}
if (DelegateHelper.TcpClientErrorMsg == null)
{
DelegateHelper.TcpClientErrorMsg = DelegateHelper.BaseVoid;
}
if (DelegateHelper.TcpClientStateInfo == null)
{
DelegateHelper.TcpClientStateInfo = DelegateHelper.BaseVoid;
}
ServerIp = ip;
ServerPort = port;
}
#endregion
}
}
标签: Socket
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)