c#TCP客户端实现,利用标志位处理接收得消息_tcp receive 接收事件 c#
一、客户端
private static Socket socket;
public static string Connect(string ip, int port)
{
if (socket != null)
{
return \"已连接\";
}
IPAddress IP = IPAddress.Parse(ip);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
res = socket.BeginConnect(new IPEndPoint(IP, port), null, null);
res.AsyncWaitHandle.WaitOne(2000, true);
if (res.IsCompleted)
{
socket.ReceiveTimeout = 2000;
//接收线程
Task.Run(() => ReceivedAsync());
return \"连接成功\";
}
else
{
socket.Close();
socket = null;
return \"连接失败\";
}
}
catch (Exception e)
{
socket.Close();
socket = null;
return $\"连接错误{e.Message}\";
}
}
//利用标志位进行接收消息
static string terminateString = \"\\r\\r\";
public static async Task ReceivedAsync()
{
try
{
socket.ReceiveTimeout = 1000;
byte[] arrRecMsg = new byte[1024 * 1024];
int rnFixLength = terminateString.Length;
while (true)
{
//定义一个1M的内存缓冲区 用于临时性存储接收到的信息
//将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
//int length = socket.Receive(arrRecMsg);
int received = await socket.ReceiveAsync(new ArraySegment(arrRecMsg), SocketFlags.None);
//将套接字获取到的字节数组转换为人可以看懂的字符串
//string strRecMsg = Encoding.Default.GetString(arrRecMsg, 0, received);
string strRecMsg = Encoding.Default.GetString(arrRecMsg, 0, received);
if (\"\".Equals(strRecMsg))
{
LogHelper.EnQueueLog(\"服务器已断开\");
DisConnect();
return;
}
//遍历接收到的buffer文本
for (int i = 0; i < strRecMsg.Length;)
{
if (i <= strRecMsg.Length - rnFixLength)
{
if (strRecMsg.Substring(i, rnFixLength) != terminateString)//非消息结束符,则加入sb
{
sb.Append(strRecMsg[i]);
i++;
}
else
{
string msg = sb.ToString();
LogHelper.EnQueueLog(msg);
//StorageQueueList.Enqueue(strRecMsg);
ProcessTcpLog(msg);
sb.Clear();
i += rnFixLength;
}
}
else
{
sb.Append(strRecMsg[i]);
i++;
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($\"远程服务器已中断连接...{ex.Message}\");
}
}
public static void ProcessTcpLog(string msg)
{
//消息处理
}
//发送消息
public static bool SendMessage(string msg)
{
//byte[] buffer = Encoding.Default.GetBytes(msg+\"/r/n\");
byte[] buffer = Encoding.Default.GetBytes(msg + \'\\r\');
return SendSeverMessage(buffer, buffer.Length);
}
private static bool SendSeverMessage(byte[] sendBuffer, int size)
{
if (res != null && res.IsCompleted && socket != null)
{
try
{
socket.BeginSend(sendBuffer, 0, size, SocketFlags.None, null, null);
return true;
}
catch (Exception) { }
}
return false;
}
//断开连接
public static string DisConnect()
{
if (res.IsCompleted && socket != null)
{
try
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = null;
return \"连接已断开\";
}
catch (Exception e)
{
return $\"连接断开错误{e.Message}\";
}
}
else
{
return \"未检测到连接\";
}
}