编程语言
首页 > 编程语言> > socket网络编程

socket网络编程

作者:互联网

Internet网络采用的协议是Tcp/IP协议,Tcp协议是一种以固接连线为基础的协议,可提供两台计算机间可靠的数据传送,称为“传输控制协议”。UDP协议是无连接通信协议,不保证可靠的数据传输,但能向若干个目标发送数据,接收发自若干个源的数据。
端口及套接字
网络程序设计中的端口(Port)并非真实的物理存在,而是一个假象的连接装置。端口被规定为一个在0-65535之间的整数,而HTTP服务一般使用80端口,FTP服务使用21端口,IIS使用25端口,MySql使用3306端口。假如一台计算机提供了HTTP、FTP等多种服务,则客户机将通过不同的端口来确定连接到服务器的哪项服务上。
注意:0-1023之间的端口号通常用于一些比较知名的网络服务和应用,普通网络应用程序则应使用1024以上的端口号。

网络程序中的套接字(Socket)用于将程序与网络连接起来。套接字是一个假想的连接装置,就像用于连接电器与电线的插座。C#将套接字抽象为类,程序设计者只需要创建Socket类对象,即可使用套接字。


IP地址封装
IP地址是一种低级协议,TCP协议和DUP协议都是在他的基础上构建。
C#提供了IP地址相关的类,包括Dns类,IPAddress类、IPHostEntry类等。位于sysytem.NET命名空间。
访问本地主机名称和ip地址

 string IP, name, localip = "10.15.0.85/24";
            string localname = Dns.GetHostName();
            IPAddress[] ips = Dns.GetHostAddresses(localname);
            foreach (IPAddress ip in ips)
            {
                if (!ip.IsIPv6SiteLocal)
                    localip = ip.ToString();
            }
            label1.Text += "本机名" + localname + " 本机IP地址: " + localip;

TCP程序设计
TCP传输控制协议是一种面向连接的、可靠的,基于字节流的传输层通信协议。在C#中,TCP程序设计是指利用Socket、TcpClient和TcpListener类编写的网络通信程序,这3个类都位于system.net。sockets命名空间。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器端程序,另一个称为客户端程序。
Socket类为网络通信提供了一套丰富的方法和属性,TCPClient和UDPClient等类在内部使用该类
TcpClient类用于在同步阻止模式下通过网络来连接、发送和接收流数据。
为使TcpClient连接并交换数据,TcpClient类或Socket实例必须侦听是否有传入的连接请求。
TCP程序实例:客户端和服务器端的交互
1.服务器端:在Main方法中创建TCP连接对象;然后监听客户端接入,并读取接入的客户端IP地址和传入的消息;

static void Main(string[] args)
        {
            int port = 888;               //端口
            TcpClient tcpClient;          //创建TCP连接对象
            IPAddress[] serverIP = Dns.GetHostAddresses("127.0.0.1");//定义IP地址  fe80::2138:d3d0:f56:d209%11
            IPAddress loacalADDress = serverIP[0];                 //IP地址
            TcpListener tcpListener = new TcpListener(loacalADDress, port);//监听套接字
            tcpListener.Start();                                             //开始监听
            Console.WriteLine("服务器启动成功,等待用户接入...");
            while (true)
            {
                try
                {
                    tcpClient = tcpListener.AcceptTcpClient();//每接收到一个客户端则生成一个TCPClient
                    NetworkStream networkStream = tcpClient.GetStream();//获取网络数据流
                    BinaryReader reader = new BinaryReader(networkStream);//定义流数据读取对象
                    BinaryWriter writer = new BinaryWriter(networkStream);//定义流数据写入对象
                    while (true)
                    {
                        try
                        {
                            string strReader = reader.ReadString();//接收消息
                            string [] strReaders = strReader.Split(new char[]{ ' ' });//截取客户端消息
                            Console.WriteLine("有客户端接入,客户IP:" + strReaders[0]);
                            Console.WriteLine("来自客户端的消息:" + strReaders[1]);
                            string strWriter = "我是服务器,欢迎光临";
                            writer.Write(strWriter);//向对方发送消息
                        }
                        catch
                        {
                            break;
                        }
                    }
                }
                catch
                {
                    break;
                }
            }
        }

2.客户端
在Main方法中创建TCP连接对象,以指定的地址和端口连接服务器;然后向服务器端发送数据和接收服务器端传输的数据。

 static void Main(string[] args)
        {
             //创建一个TCPClient对象,自动分配IP地址和端口号
            TcpClient tcpClient = new TcpClient();
            //连接服务器,其IP端口号为127.0.0.1和888
            tcpClient.Connect("127.0.0.1",888);
            //判断连接是否成功
            if (tcpClient != null)
            {
                Console.WriteLine("服务器连接成功");
                NetworkStream networkStream = tcpClient.GetStream();//获取数据流
                BinaryReader reader = new BinaryReader(networkStream);//定义流数据读取对象
                BinaryWriter writer = new BinaryWriter(networkStream);//第一数据流写对象
                string localip = "127.0.0.1";//存储本机ip,默认值为127.0.0.1
                IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());//获取所有ip地址
                foreach (IPAddress ip in ips)
                {
                    if (!ip.IsIPv6SiteLocal)//如果不是ipv6地址
                        localip = ip.ToString();//获取本机ip地址
                }
                writer.Write(localip+" 你好服务器,我是客户端");//向服务器发送数据
                while (true)
                {
                    try
                    {
                        string strReader = reader.ReadString();//接收服务器发送的数据
                        if (strReader != null)
                        {
                            Console.WriteLine("来自服务器的消息是:"+strReader);
                        }
                    }
                    catch
                    {
                        break;
                    }
                }
            }
            Console.WriteLine("连接服务器失败");
        }

在这里插入图片描述


UDP程序设计
用户数据报协议,它是网络信息传输的另一种形式。UDP通信和TCP通信不同,基于UDP的信息传输更快,但不提供可靠的保证。
UdpClient类用于在同步阻止模式下发送和接收无连接的UDP数据报。因为UDP是无连接传输协议,所以不需要再发送和接收数据前建立远程主机连接,但可以选择使用下面两种方法之一建立默认远程主机。
1.使用远程主机名和端口号作为参数创建UdpClient类的实例。
2.创建UdpClient类的实例,然后调用Connect方法。
UDP网络程序实例,广播数据报程序
(1)创建广播主机项目Server,在Main方法中创建DUP连接;然后通过DUP不断向外发送广播信息。

class Program
    {
        static UdpClient udp = new UdpClient();//创建UdpClient对象

        static void Main(string[] args)
        {
            udp.Connect("127.0.0.1", 888);//调用UdpClient对象的Connect方法建立默认远程主机
            while (true)
            {
                Thread thread = new Thread(new ThreadStart(Way1));             
                 thread.Start();
            }
        }
        static public void Way1()
        {
            while (true)
            {
                try
                {
                    Byte[] sendBytes = Encoding.Default.GetBytes("(" + DateTime.Now.ToLongTimeString() + ")节目预报:8点有大型晚会,请收听");//定义一个字节数组,用来存放发送到远程主机的信息
                    Console.WriteLine("(" + DateTime.Now.ToLongTimeString() + ")节目预报:8点有大型晚会,请收听");
                    udp.Send(sendBytes, sendBytes.Length);//调用UdpClient对象的Send方法将UDP数据发送到远程主机上
                    Thread.Sleep(5000);
                }
                catch (Exception EX)
                {
                    Console.WriteLine(EX.Message);
                }
            }
        }
    }

(2)创建接收广播项目Client,单击“开始接收”按钮,系统开始接收主机播出的信息;单击“停止接收”按钮,系统会停止接收广播播出的信息。

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//在其他线程中可以调用主窗体控件
        }
        bool flag=true;
        UdpClient udp;
        Thread thread;
        IPEndPoint ipendpoint;
        private void button1_Click(object sender, EventArgs e)
        {
            udp = new UdpClient(888);//使用端口号创建UDP连接对象
            flag = true;
           ipendpoint = new IPEndPoint(IPAddress.Any, 888);//创建IPEndPoint对象,用来响应主机的标识
           // Thread thread = new Thread(new ThreadStart(Way2));
           thread = new Thread(Way2);
           thread.Start();
         
        }

        public void Way2()
        {
            while (flag)
            {
                try
                {
                    if (udp.Available <= 0) continue;//判断是否有网络数据;遇到continue后,不执行continue后面的代码,执行下一次循环。
                    if (udp.Client == null) return;//判断连接是否为空、// return 直接跳过main函数,立即结束本次方法的执行
                    byte[] bytes = udp.Receive(ref ipendpoint);
                    //将获得的UDP数据转换为字符串形式
                    string str = Encoding.Default.GetString(bytes);
                    textBox2.Text = "正在接收的信息:"+str;
                    textBox1.Text += "\n" + str;//显示接收的所有数据
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                Thread.Sleep(2000);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            flag = false;
            if (thread.ThreadState == ThreadState.Running)
                thread.Abort();
            udp.Close();
        }


    }
    

在这里插入图片描述

标签:socket,ip,UdpClient,编程,网络,TCP,new,连接,string
来源: https://blog.csdn.net/weixin_42974146/article/details/88382615