C# 学习笔记 20.网络编程

本文详细讲解了TCP三次握手及服务器与客户端的实现,同时对比了TCP与UDP在网络程序中的应用,展示了UDP的简单与快速。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基础知识

OSI(open system interconnection)模型把网络通信分成7层:物理层,数据链路层,网络层,传输层,会话层,表示层,和应用层。

网络开发人员一般分成5层   应用层 传输层 网络层 数据链路层 物理层

2.基于TCP的网络程序的实现

tcp的工作过程可以划分为3个阶段:连接的建立,传输数据和断开连接。

TCP的连接建立是通过3次握手最终完成的。

tpc 服务器和客户端代码

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

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        private int port = 5000;
        private TcpClient tcpClient = null;
        IPAddress ipaddress;
        private NetworkStream networkStream = null;
        private BinaryReader reader;
        private BinaryWriter writer;
        //声明委托
        private delegate void ShowMessage(string str);
        private ShowMessage showMessageCallback;

        private delegate void ResetMessage();
        private ResetMessage resetMessageCallback;
        public Form1()
        {
            InitializeComponent();
            showMessageCallback = new ShowMessage(showMessage);
            resetMessageCallback = new ResetMessage(restMessage);
            ipaddress = IPAddress.Loopback;
            this.textBox_ip.Text = ipaddress.ToString();
            this.textBox_port_id.Text = port.ToString();
        }

        private void showMessage(string str)
        {
            listBox1.Items.Add(tcpClient.Client.RemoteEndPoint);
            listBox1.Items.Add(str);
            listBox1.TopIndex = listBox1.Items.Count - 1;
        }
        private void restMessage()
        {
            textBox1.Text = string.Empty;
            textBox1.Focus();
        }
        private void button_start_Click(object sender, EventArgs e)
        {
        

            Thread accept_thread = new Thread(acceptClientConnet);
            accept_thread.Start();

        }

        private void acceptClientConnet()
        {
            try
            {
                IPAddress iPAddress = IPAddress.Parse(textBox_ip.Text);
                tcpClient = new TcpClient();
                tcpClient.Connect(iPAddress, int.Parse(textBox_port_id.Text));
                if (tcpClient != null)
                {
                    listBox1.Invoke(showMessageCallback, "接收到连接");
                    networkStream = tcpClient.GetStream();
                    reader = new BinaryReader(networkStream);
                    writer = new BinaryWriter(networkStream);
                }
            }
            catch
            {
                listBox1.Invoke(showMessageCallback, "链接失败");
            }
        }


        private void button_clear_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }

        private void button_receive_Click(object sender, EventArgs e)

        {
            Thread receive_mes = new Thread(ReceiveMessage);
            receive_mes.Start();
        }
        private void ReceiveMessage()
        {
            try
            {
                string receive_message = reader.ReadString();
                listBox1.Invoke(showMessageCallback, receive_message);
            }
            catch
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (writer != null)
                {
                    writer.Close();
                }
                if (tcpClient != null)
                {
                    tcpClient.Close();
                }
        
            }
        }

        private void button_send_Click(object sender, EventArgs e)
        {
            Thread send_thread = new Thread(SendMessage);
            send_thread.Start(textBox1.Text);
        }
        private void SendMessage(object state)
        {
            listBox1.Invoke(showMessageCallback, "正在发送");

            try
            {
                writer.Write(state.ToString());
                Thread.Sleep(500);
                writer.Flush();
                listBox1.Invoke(showMessageCallback, "发送完毕");
                textBox1.Invoke(resetMessageCallback, null);

                listBox1.Invoke(showMessageCallback, state.ToString());

            }
            catch
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (writer != null)
                {
                    writer.Close();
                }
                if (tcpClient != null)
                {
                    tcpClient.Close();
                }
                listBox1.Invoke(showMessageCallback, "链接断开了");

            }
        }

        private void button_disconnect_Click(object sender, EventArgs e)
        {
            if (reader != null)
            {
                reader.Close();
            }
            if (writer != null)
            {
                writer.Close();
            }
            if (tcpClient != null)
            {
                tcpClient.Close();
            }
            listBox1.Invoke(showMessageCallback, "链接断开了");

 
        }


    }
}

//客户端

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

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        private int port = 5000;
        private TcpClient tcpClient = null;
        IPAddress ipaddress;
        private NetworkStream networkStream = null;
        private BinaryReader reader;
        private BinaryWriter writer;
        //声明委托
        private delegate void ShowMessage(string str);
        private ShowMessage showMessageCallback;

        private delegate void ResetMessage();
        private ResetMessage resetMessageCallback;
        public Form1()
        {
            InitializeComponent();
            showMessageCallback = new ShowMessage(showMessage);
            resetMessageCallback = new ResetMessage(restMessage);
            ipaddress = IPAddress.Loopback;
            this.textBox_ip.Text = ipaddress.ToString();
            this.textBox_port_id.Text = port.ToString();
        }

        private void showMessage(string str)
        {
            listBox1.Items.Add(tcpClient.Client.RemoteEndPoint);
            listBox1.Items.Add(str);
            listBox1.TopIndex = listBox1.Items.Count - 1;
        }
        private void restMessage()
        {
            textBox1.Text = string.Empty;
            textBox1.Focus();
        }
        private void button_start_Click(object sender, EventArgs e)
        {
        

            Thread accept_thread = new Thread(acceptClientConnet);
            accept_thread.Start();

        }

        private void acceptClientConnet()
        {
            try
            {
                IPAddress iPAddress = IPAddress.Parse(textBox_ip.Text);
                tcpClient = new TcpClient();
                tcpClient.Connect(iPAddress, int.Parse(textBox_port_id.Text));
                if (tcpClient != null)
                {
                    listBox1.Invoke(showMessageCallback, "接收到连接");
                    networkStream = tcpClient.GetStream();
                    reader = new BinaryReader(networkStream);
                    writer = new BinaryWriter(networkStream);
                }
            }
            catch
            {
                listBox1.Invoke(showMessageCallback, "链接失败");
            }
        }


        private void button_clear_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }

        private void button_receive_Click(object sender, EventArgs e)

        {
            Thread receive_mes = new Thread(ReceiveMessage);
            receive_mes.Start();
        }
        private void ReceiveMessage()
        {
            try
            {
                string receive_message = reader.ReadString();
                listBox1.Invoke(showMessageCallback, receive_message);
            }
            catch
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (writer != null)
                {
                    writer.Close();
                }
                if (tcpClient != null)
                {
                    tcpClient.Close();
                }
        
            }
        }

        private void button_send_Click(object sender, EventArgs e)
        {
            Thread send_thread = new Thread(SendMessage);
            send_thread.Start(textBox1.Text);
        }
        private void SendMessage(object state)
        {
            listBox1.Invoke(showMessageCallback, "正在发送");

            try
            {
                writer.Write(state.ToString());
                Thread.Sleep(500);
                writer.Flush();
                listBox1.Invoke(showMessageCallback, "发送完毕");
                textBox1.Invoke(resetMessageCallback, null);

                listBox1.Invoke(showMessageCallback, state.ToString());

            }
            catch
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (writer != null)
                {
                    writer.Close();
                }
                if (tcpClient != null)
                {
                    tcpClient.Close();
                }
                listBox1.Invoke(showMessageCallback, "链接断开了");

            }
        }

        private void button_disconnect_Click(object sender, EventArgs e)
        {
            if (reader != null)
            {
                reader.Close();
            }
            if (writer != null)
            {
                writer.Close();
            }
            if (tcpClient != null)
            {
                tcpClient.Close();
            }
            listBox1.Invoke(showMessageCallback, "链接断开了");

 
        }


    }
}

//UDP

Tcp 是一种面向连接的可靠的,面向字节流的传输协议;而udp是一种简单的

面向数据包的无连接协议是一种不可靠的传输服务。

udp的传输速度比tcp快

udp有消息边界

udp可以进行1对多的传输

// udp 我测试怎么是单向传输呢,后面有空再测试

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;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace upd
{
    public partial class Form1 : Form
    {
        private UdpClient send_udp_client_;
        private UdpClient receive_udp_client_;
        public Form1()
        {
            InitializeComponent();
            IPAddress[] ips = Dns.GetHostAddresses("");
            foreach (var ip in ips)
            {
                if(ip.ToString().Contains("192"))
                {
                    textBox_local_ip.Text = ip.ToString();
                    textBox_remote_ip.Text = ip.ToString();
                    break;
                }
             
            }
         
            int port = 51883;
            int send_port = 11883;
            textBox_local_port.Text = port.ToString();
            textBox_remote_port.Text = send_port.ToString();
        }
        private void button_send_Click(object sender, EventArgs e)
        {
            if(textBox_send.Text == string.Empty)
            {
                MessageBox.Show("发送内容不能为空","提示");
                return;
            }

            IPAddress local_ip = IPAddress.Parse(textBox_local_ip.Text);
            IPEndPoint local_ip_end_point = new IPEndPoint(local_ip, int.Parse(textBox_local_port.Text));

            send_udp_client_ = new UdpClient(local_ip_end_point);

            Thread send_thread = new Thread(SendMessage);
            send_thread.Start(textBox_send.Text);


        }
        private void SendMessage(object obj)
        {
            string message = (string)obj;
            byte[] send_bytes = Encoding.Unicode.GetBytes(message);
            IPAddress remote_ip = IPAddress.Parse(textBox_remote_ip.Text);

            IPEndPoint remote_ip_end_point = new IPEndPoint(remote_ip, int.Parse(textBox_remote_port.Text));

            send_udp_client_.Send(send_bytes, send_bytes.Length, remote_ip_end_point);

            textBox_send.BeginInvoke((Action)delegate
            {
                textBox_send.Clear();
                textBox_send.Focus();
            });
        }

        private void button2_Click(object sender, EventArgs e)//receive
        {
            IPAddress local_ip = IPAddress.Parse(textBox_local_ip.Text);
            IPEndPoint local_ip_end_point = new IPEndPoint(local_ip, int.Parse(textBox_local_port.Text));
            try
            {
                receive_udp_client_ = new UdpClient(local_ip_end_point);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            Thread receiveThread = new Thread(ReceiveMessage);
            receiveThread.Start();
        }
        private void ReceiveMessage()
        {
            if (receive_udp_client_ == null)
                return;

            IPEndPoint remote_ip_end_point = new IPEndPoint(IPAddress.Any,0);


            while(true)
            {
                try
                {
                    byte[] receive_bytes = receive_udp_client_.Receive(ref remote_ip_end_point);
                    string msg = Encoding.Unicode.GetString(receive_bytes);

                    listBox_receive.BeginInvoke((Action)delegate
                    {
                        listBox_receive.Items.Add(string.Format("{0}[{1}]", remote_ip_end_point, msg));
                    });
                }
                catch
                {
                    break;
                }

            }

         
        }

        private void button_clear_Click(object sender, EventArgs e)
        {
            this.listBox_receive.Items.Clear();
        }

        private void button_stop_Click(object sender, EventArgs e)
        {
            receive_udp_client_.Close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值