当前位置:   article > 正文

C# 使用TCP发送和接收消息_c# tcpclient.onreceive

c# tcpclient.onreceive

客户端连接服务器

using System.Net.Sockets;
using System.Net;

Socket clientSocket = null;
string ip = "192.168.1.2", myIP = "192.168.1.1";
int port = 8080;

// 设置连接
EndPoint myPoint = new IPEndPoint(IPAddress.Parse(myIP), 0);    // 绑定本地IP(本地多网口时),0表示任意端口
EndPoint point = new IPEndPoint(IPAddress.Parse(ip), port);		// Server IP 和端口

/// <summary>
/// 建立与服务器的TCP/IP连接
/// </summary>
/// <returns>成功返回true,反之返回false</returns>
public Boolean Connect()
{
    Console.Write("连接中...");
    //创建一个新的Socket对象
   	clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    // 建立TCP / IP连接
    try
    {
        clientSocket.Bind(myPoint);     //绑定本地IP,多IP防止串(若无此IP则可能抛出异常)                            
        clientSocket.Connect(point);       //尝试连接
        Console.WriteLine("连接成功!");
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"连接异常:\n{ex}");
        clientSocket.Close();
        clientSocket.Dispose();
        return false;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

发送消息

定义

/// <summary>
/// 发送执行函数(使用异步方式发送消息,不用阻塞等待)
/// </summary>
/// <param name="msg">待发送信息的byte数组</param>
/// <returns></returns>
public async Task<int> Send(byte[] msg)
{
    if (clientSocket is null || !clientSocket.Connected) while (!Connect()) ;	// 如果未连接,就连接上
    int len = await Task<int>.Run(() => clientSocket.Send(msg));	//把字节数组发送到服务器端
    Console.WriteLine("发送成功!");
    return len;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

应用

Task<int> len = siExecutor.Send(bytes);		
// 这里可以处理一些其他工作
// 使用len.Result并处理(此步导致阻塞等待,会等待异步返回)
Console.Write($"已发送长度:{len.Result}");
  • 1
  • 2
  • 3
  • 4

接收消息

定义

/// <summary>
/// 接收信息(使用异步方式接收消息,不用阻塞等待)
/// </summary>
/// <returns>返回字节数组</returns>
public async Task<byte[]> Receive(int toReadLen)
{
    if (clientSocket is null || !clientSocket.Connected) while (!Connect()) ;	// 如果未连接,就连接上    
    byte[] rawData = new byte[toReadLen];		// 接收的原数据的字节数组    
    int len = await Task<int>.Run(() => clientSocket.Receive(rawData, 0, toReadLen, SocketFlags.None));	// 接收到扫码器传来的信息
    return rawData;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

应用

Task<byte[]> rawData = siExecutor.Receive(14);
// 此处可以进行其他工作
// 使用rawData.Result并处理(会等待异步返回)
Console.WriteLine(BitConverter.ToString(rawData.Result);)
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/650849
推荐阅读
相关标签
  

闽ICP备14008679号