c# TCP/IP通信

首先是监听

namespace TcpIpTest
{
    public partial class ListenerForm : Form
    {
        private Thread listenThread;
        public bool keepReading=false;

        public ListenerForm()
        {
            InitializeComponent();
        }

        private void actionButton_Click(object sender, EventArgs e)
        {
            if (!keepReading)
            {
                string address = IPAddressTextBox.Text;
                string port = IPPortTextBox.Text;
                string addressRegex = @"^\d+\.\d+\.\d+\.\d+$";
                string portRegx = @"^\d+$";
                if (Regex.IsMatch(address, addressRegex) && Regex.IsMatch(port, portRegx))
                {
                    keepReading = true;
                    //监听的是本地的IP地址,因为电脑可以同时链接到多个网络,所以一台电脑可以同时有不同的IP地址,这里需要指明要监听哪个IP的哪个端口
                    listenThread = new Thread(() => ipListen(IPAddress.Parse(address), int.Parse(port)));
                    listenThread.Start();
                    this.stateLabel.Text = "正在监听";
                    this.actionButton.Text = "停止监听";
                }
                else
                {
                    MessageBox.Show("请填写正确的IP地址和端口");
                }
            }
            else
            {
                keepReading = false;
                this.stateLabel.Text = "空闲";
                this.actionButton.Text = "开始监听";
            }
        }
        private void ipListen(IPAddress address, int port)
        {
            TcpListener listener = new TcpListener(address, port);
            listener.Start();
            OneString oneString = new OneString(changeResultTextBox);
            while (keepReading)//这是一个阀,来控制是否脱离线程,因为要把listener停掉,所以不能用abort来关闭线程
            {
                if (listener.Pending())//这是判断是否有输入的,必须要加这个判断,不然线程就会在下面的AcceptTcpClient卡住
                {
                     using (TcpClient client = listener.AcceptTcpClient())
                    {
                        //接收
                        NetworkStream netStream = client.GetStream();
                        byte[] receiveBytes = new byte[client.ReceiveBufferSize];
                        netStream.Read(receiveBytes, 0, client.ReceiveBufferSize);
                        string str = Encoding.Default.GetString(receiveBytes).TrimEnd('\0');
                        //返回
                        byte[] sendBytes = Encoding.Default.GetBytes("receive!");
                        netStream.Write(sendBytes, 0, sendBytes.Length);
                        netStream.Close();
                    }
                }
            }
            listener.Stop();
        }
        private delegate void OneString(string content);

        private void changeResultTextBox(string content)
        {
            this.resultTextBox.Text += content;
        }
        private void ListenerForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            keepReading = false;
        }
    }
}

然后是发送

namespace TcpIpTest
{
    public partial class SendForm : Form
    {
        public SendForm()
        {
            InitializeComponent();
        }

        private void sendButton_Click(object sender, EventArgs e)
        {
            string address = IPAddressTextBox.Text;
            string port = IPPortTextBox.Text;
            string addressRegex = @"^\d+\.\d+\.\d+\.\d+$";
            string portRegx = @"^\d+$";
            string content = this.contentTextBox.Text;
            if (Regex.IsMatch(address, addressRegex) && Regex.IsMatch(port, portRegx) && !string.IsNullOrWhiteSpace(content))
            {
                using (TcpClient client = new TcpClient())
                {
                    try
                    {
                        //这里是目标的IP地址和端口
                        client.Connect(address, int.Parse(port));
                        NetworkStream netStream = client.GetStream();
                        byte[] sendBytes = Encoding.Default.GetBytes(this.contentTextBox.Text);
                        netStream.Write(sendBytes, 0, sendBytes.Length);
                        //接收
                        byte[] receiveBytes = new byte[client.ReceiveBufferSize];
                        netStream.Read(receiveBytes, 0, client.ReceiveBufferSize);
                        string str = Encoding.Default.GetString(receiveBytes).TrimEnd('\0');
                        MessageBox.Show(str);
                        netStream.Close();
                    }
                    catch (Exception e1)
                    {
                        if (e1 is SocketException)
                        {
                            MessageBox.Show("无法ping通");
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("请填写正确的IP地址、端口和内容");
            }
        }
    }
}

 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值