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())
                    {
                        using (StreamReader reader = new StreamReader(client.GetStream(), Encoding.Default))
                        {
                            string content = reader.ReadToEnd();
                            this.Invoke(oneString, content);
                        }
                    }
                }
            }
            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));
                        using (StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.Default))
                        {
                            writer.Write(content);
                        }
                    }
                    catch (Exception e1)
                    {
                        if (e1 is SocketException)
                        {
                            MessageBox.Show("無法ping通");
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("請填寫正確的IP地址、端口和內容");
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章