C#使用Socket局域网内推送消息

代码不是我的原创,东拼西凑的结合体。

当A电脑开启监听端口时,B电脑输入A电脑的IP和端口可以像B电脑发送消息。
当然AB电脑在统一局域网内。
在这里插入图片描述
socket接收消息

public Form1()
{
    InitializeComponent();
    Control.CheckForIllegalCrossThreadCalls = false;
    Color c = Color.FromArgb(255, 0, 0);
    this.pictureBox1.BackColor = c;
}
 
/// <summary>
/// 开启监听
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    this.Listen(int.Parse(textBox_port.Text));//端口
    Color c = Color.FromArgb(0, 255, 0);
    this.pictureBox1.BackColor = c;
}
 
#region 接收Socket
 
private static Encoding encode = Encoding.Default;
 
/// <summary>
/// 监听请求
/// </summary>
/// <param name="port">端口</param>
public void Listen(int port)
{
    Task.Run(() =>
    {
        try
        {
            Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listenSocket.Bind(new IPEndPoint(IPAddress.Any, port));
            listenSocket.Listen(100);
            this.Logs_Info("开启监听" + port + "端口...");
 
            while (true)
            {
                Socket acceptSocket = listenSocket.Accept();
                string receiveData = Receive(acceptSocket, 5000); 
                if (receiveData == "1")//如果接收到的消息是1,窗口最小化
                    this.Minimized();
                this.Logs_Info("Receive:" + receiveData);
                acceptSocket.Send(encode.GetBytes("ok"));
                DestroySocket(acceptSocket);
            }
        }
        catch (Exception e)
        {
            throw;
        }
    });
}
 
/// <summary>
/// 窗口最小化
/// </summary>
private void Minimized()
{
    Task.Run(() =>
    {
        this.WindowState = FormWindowState.Minimized;
    });
}
 
//输出文本框
private void Logs_Info(string message)
{
    try
    {
        if (textBox1.InvokeRequired)//跨线程了
            textBox1.Invoke(new EventHandler(delegate
            {
                textBox1.AppendText("[Info]{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
            }));
        else//同线程直接赋值
            textBox1.AppendText("[Info]{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
    }
    catch { }
}
 
/// <summary>
/// 接收数据
/// </summary>
/// <param name="socket"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private string Receive(Socket socket, int timeout)
{
    string result = string.Empty;
    socket.ReceiveTimeout = timeout;
    List<byte> data = new List<byte>();
    byte[] buffer = new byte[1024];
    int length = 0;
    try
    {
        while ((length = socket.Receive(buffer)) > 0)
        {
            for (int j = 0; j < length; j++)
            {
                data.Add(buffer[j]);
            }
            if (length < buffer.Length)
            {
                break;
            }
        }
    }
    catch { }
    if (data.Count > 0)
    {
        result = encode.GetString(data.ToArray(), 0, data.Count);
    }
    return result;
}
 
/// <summary>
/// 销毁Socket对象
/// </summary>
/// <param name="socket"></param>
private void DestroySocket(Socket socket)
{
    if (socket.Connected)
    {
        socket.Shutdown(SocketShutdown.Both);
    }
    socket.Close();
}

socket发送消息

public Form1()
{
    InitializeComponent();
}
 
/// <summary>
/// 发送按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    string IP=this.textBox_IP.Text;//ip
    int port=int.Parse(this.textBox_端口.Text);//端口
    string news=this.textBox1.Text;//发送消息内容
    this.SendMessage(IP, port, news);
}
 
/// <summary>
/// 字符编码处理.
/// </summary>
private Encoding ASCII;
 
/// <summary>
/// 发送
/// </summary>
/// <param name="IP"></param>
/// <param name="port"></param>
/// <param name="news"></param>
public void SendMessage(string IP, int port, string news)
{
    ASCII = Encoding.ASCII;
    // 构造用于发送的 字节缓冲.
    Byte[] sendBytes = ASCII.GetBytes(news);
 
    // 构造用于接收的 字节缓冲.
    Byte[] recvBytes = new Byte[256];
 
    // IP地址.
    IPAddress localAddr = IPAddress.Parse(IP);
    // 接入点.
    IPEndPoint ephost = new IPEndPoint(localAddr, port);
 
    // 第一个参数:AddressFamily = 指定 Socket 类的实例可以使用的寻址方案。
    //     Unspecified 未指定地址族。
    //     InterNetwork IP 版本 4 的地址。
    //     InterNetworkV6 IP 版本 6 的地址。
    //
    // 第二个参数:SocketType = 指定 Socket 类的实例表示的套接字类型。
    //     Stream 一个套接字类型,支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。
    //            此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。
    //            此套接字类型使用传输控制协议 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。
    //
    // 第三个参数:ProtocolType = 指定 Socket 类支持的协议。
    //     Tcp 传输控制协议 (TCP)。
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    try
    {
        // 尝试连接主机.
        s.Connect(ephost);
        Logs_Info("向服务器发送到了:{0}".FormatWith(news));
 
        // 向主机发送数据.
        s.Send(sendBytes, sendBytes.Length, SocketFlags.None);
        // 接收服务器的应答.
        Int32 bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
        StringBuilder buff = new StringBuilder();
        while (bytes > 0)
        {
            // 将缓冲的字节数组,装换为字符串.
            String str = ASCII.GetString(recvBytes, 0, bytes);
            // 加入字符串缓存
            buff.Append(str);
            // 再次接受,看看后面还有没有数据.
            bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
        }
        Logs_Info("从服务器接收到了:{0}".FormatWith(buff.ToString()));
    }
    catch (Exception ex)
    {
        Logs_Info("连接/发送/接收过程中,发生了错误!");
        Logs_Info(ex.Message);
        Logs_Info(ex.StackTrace);
    }
    finally
    {
        s.Close();
    }
}
 
/// <summary>
/// 输出消息
/// </summary>
/// <param name="message"></param>
private void Logs_Info(string message)
{
    try
    {
        if (textBox2.InvokeRequired)
            textBox2.Invoke(new EventHandler(delegate
            {
                textBox2.AppendText("[Info]{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
            }));
        else
            textBox2.AppendText("[Info]{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
    }
    catch { }
}

点击下载Dome

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

CXYliukai

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值