C# Socket 通信(winfrom案例)

C# 专栏收录该内容
6 篇文章 0 订阅

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SocketServerDemo
{
    public partial class FrmServerDemo : Form
    {
        public FrmServerDemo()
        {
            InitializeComponent();
        }
        public Socket mysocket;//Socket对象
        bool Stop = false;//标志位

        //打开服务器监听客户端连接请求
        private void txtOpenServer_Click(object sender, EventArgs e)
        {
            try
            {
                IPAddress ipadr = IPAddress.Parse("127.0.0.1");//服务器IP地址
                TcpListener mylistrn = new TcpListener(ipadr, 6001);//实例化监听助手类对象
                mylistrn.Start();//开始监听
                lstInfo.Items.Add("服务器启动!");//提示信息
                while (true)
                {
                    if (Stop == true)//标志位
                    {
                        tmrServer.Stop();//关闭计时器
                        break;
                    }
                    Application.DoEvents();//防止死循环时程序未响应
                    if (mylistrn.Pending())//判断是否有客户端连接请求
                    {
                        mysocket = mylistrn.AcceptSocket();//接受客户端请求
                        mysocket.Send(Encoding.Unicode.GetBytes("服务器连接成功!"));//向客户端发送消息,收到表示连接成功
                        tmrServer.Start();//启动定时器,循环监听客户端发送的消息,此处也可用线程,不过timer也是多线程的而且可以跨线程共享资源

                    }
                }
                Application.Exit();//释放资源,关闭程序
            }
            catch (Exception ex)
            {
                MessageBox.Show("Listen  Error" + ex.Message);//异常提示
            }
        }

        // 为客户端开辟独立线程监听消息100毫秒执行一次
        private void tmrServer_Tick(object sender, EventArgs e)
        {
            byte[] data = new byte[1024];
            if (mysocket.Available > 0)
            {
                mysocket.Receive(data);//读取数据
                string content = Encoding.Unicode.GetString(data);//把字节流转字符串
                lstInfo.Items.Add(content);//显示字符
            }
        }

        //用于给标志位Stop赋值
        private void FrmServerDemo_FormClosing(object sender, FormClosingEventArgs e)
        {
            Stop = true;
        }

    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace SocketClient
{
    public partial class FrmClient : Form
    {
        public FrmClient()
        {
            InitializeComponent();
        }
        TcpClient tcpClient = new TcpClient();//客户端助手类
        NetworkStream ns;//数据流对象
        bool Stop = false;//标志位,用于释放资源

        //btnSend_Click时间用于客户端向服务器发送数据
        private void btnSend_Click(object sender, EventArgs e)
        {
            ns = tcpClient.GetStream();//实例化NetworkStream
            string count = txtInfo.Text.Trim();//要发送的字符串
            byte[] data = Encoding.Unicode.GetBytes(count);//把字符串转化为字节数组,因为网络数据传输的是字节
            ns.Write(data, 0, data.Length);//把字符串转化为字节数组,因为网络数据传输的是字节
            txtInfo.Clear();
        }

        // btnConn_Click事件用于连接服务端并监听消息接收。
        private void btnConn_Click(object sender, EventArgs e)
        {
            try
            {
                tcpClient.Connect(txtIp.Text.Trim(), 6001);//连接服务器
                ns = tcpClient.GetStream();//实例化NetworkStream
                byte[] bytes = Encoding.Unicode.GetBytes("客户端上线!");//把字符串转化为字节数

                ns.Write(bytes, 0, bytes.Length);//向服务端发送数据,收到表示连接成功
                while (true)//向服务端发送数据,收到表示连接成功
                {
                    if (Stop == true)//标志位 跳出死循环
                    {
                        break;
                    }
                    Application.DoEvents();//防止死循环时程序未响应
                    if (tcpClient.Available > 0)//判断是否有数据可供读取
                    {
                        byte[] data = new byte[1024];
                        ns.Read(data, 0, 1024);//读取数据
                        string content = Encoding.Unicode.GetString(data);//把字节流转换为字符串
                        lstInfo.Items.Add(content);//显示字符串
                    }
                }
                Application.Exit();//释放资源,关闭程序
            }
            catch (Exception ex)
            {
                MessageBox.Show("服务未开启!" + ex.Message);//异常提示
            }
        }

        // 用于给标志位Stop赋值
        private void FrmClient_FormClosing(object sender, FormClosingEventArgs e)
        {
            Stop = true;
        }


    }
}

 

  • 2
    点赞
  • 5
    评论
  • 16
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值