C# Socket多个客户端怎么调用同一个TcpClient

suwei_you 2017-11-15 08:52:51
public class TCPClient
{
#region 属性
/// <summary>
/// 服务端IP
/// </summary>
public string ServerIp;
/// <summary>
/// 服务端监听端口
/// </summary>
public int ServerPort;
/// <summary>
/// TcpClient客户端
/// </summary>
public TcpClient Tcpclient = null;
/// <summary>
/// Tcp客户端连接线程
/// </summary>
public Thread Tcpthread= null;
/// <summary>
/// 是否启动Tcp连接线程
/// </summary>
public bool IsStartTcpthreading = false;
/// <summary>
/// 连接是否关闭(用来断开重连)
/// </summary>
public bool Isclosed= false;
/// <summary>
/// 设置断开重连时间间隔单位(毫秒)(默认3000毫秒)
/// </summary>
public int ReConnectionTime = 3000;
/// <summary>
/// 接收Socket数据包 缓存字符串
/// </summary>
public string Receivestr;
/// <summary>
/// 重连次数
/// </summary>
public int ReConectedCount = 0;
#endregion

#region 构造函数
/// <summary>
/// 初始化TCPClient类
/// </summary>
/// <param name="ip">服务端IP</param>
/// <param name="port">监听端口</param>
public TCPClient(string ip, string port)
{
ServerIp = ip;
ServerPort = int.Parse(port);
}
#endregion

#region 方法
/// <summary>
/// 启动连接Socket服务器
/// </summary>
public void StartConnection()
{
try
{
CreateTcpClient();
}
catch (Exception ex)
{
//DelegateHelper.TcpClientErrorMsg("错误信息:" + ex.Message);
}
}

/// <summary>
/// 创建线程连接
/// </summary>
private void CreateTcpClient()
{
if (Isclosed)
return;
Isclosed = true;

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
{
// Thread.Sleep(50);
if (!Tcpclient.Connected)
{
Tcpclient = new TcpClient();
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;
}
}
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
//此时线程将结束,人为结束,自动判断是否重连
Thread.Sleep(ReConnectionTime);
CreateTcpClient();
}
catch (Exception ex)
{
//CreateTcpClient();
//返回错误信息
//DelegateHelper.TcpClientErrorMsg("错误信息:" + ex.Message);
}
}

/// <summary>
/// 断开连接
/// </summary>
public void StopConnection()
{
IsStartTcpthreading = false;
Isclosed = false;
Tcpclient.Close();
Tcpthread.Interrupt();
Tcpthread.Abort();
//DelegateHelper.TcpClientStateInfo("断开连接",EnumClass.SocketState.Disconnect);
}

/// <summary>
/// 发送Socket消息
/// </summary>
/// <param name="cmdstr"></param>
public void SendCommand(string cmdstr)
{
try
{
byte[] _out = Encoding.Default.GetBytes(cmdstr);
Tcpclient.Client.Send(_out);
}
catch (Exception ex)
{
//返回错误信息
//DelegateHelper.TcpClientErrorMsg(ex.Message);
}
}
#endregion
}


#region IPlugin接口实现方法
TCPClient _tcpClient;
/// <summary>
/// 初始化连接
/// </summary>
public void Init(string ip, string port, string servername, string state, string heartbeat)
{
_tcpClient = new TCPClient(ip, port);
_tcpClient.StartConnection();
heartbeatMessage = heartbeat;
HeartStart();
}
#endregion

#region 心跳
string heartbeatMessage = null;
private Thread TcpHeart { get; set; }
/// <summary>
/// 心跳方法
/// </summary>
public void HeartStart()
{
TcpHeart = new Thread(new ThreadStart(RunKeepAliveThread));
TcpHeart.IsBackground = true;
TcpHeart.Start();
}
private void RunKeepAliveThread()
{
while (true)
{
Thread.Sleep(30 * 1000);
//平板切纸机心跳报文
string msg = string.Format($"{heartbeatMessage}\n");
//指令下发
if (_tcpClient != null)
_tcpClient.SendCommand(msg);
}
}
#endregion
...全文
390 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
X-i-n 2017-11-16
  • 打赏
  • 举报
回复
还是没太明白你的场景。20台设备和同一台中心服务器连接?
suwei_you 2017-11-16
  • 打赏
  • 举报
回复
<SocketClient> <DllName name="App.Das.Plugin.Socket.SheetCutter.dll"> <SocketList> <Ip>127.0.0.1</Ip> <Port>4001</Port> <ServerName></ServerName> <State>1</State> <HeartBeat>127.0.0.1:4001|4001|4001|4001</HeartBeat> <ClassName>SheetCutterInterface</ClassName> </SocketList> <SocketList> <Ip>127.0.0.1</Ip> <Port>4002</Port> <ServerName></ServerName> <State>1</State> <HeartBeat>127.0.0.1:4002|4002|4002|4002</HeartBeat> <ClassName>SheetCutterInterface</ClassName> </SocketList> </DllName> </SocketClient> 我是想通过读取XML里的Dll来处理,对于同一类型设备我有20台都是相同的这一个dll,如果TcpClient不能复用那该怎么弄?
X-i-n 2017-11-15
  • 打赏
  • 举报
回复
代码有点长,具体是什么场景?多个客户端是多个exe还是同一个程序里不同的EndPoint? 不过TCP是面向连接的协议,TcpClient不能复用。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧