ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

socket网络编程

2019-03-11 20:54:27  阅读:235  来源: 互联网

标签:socket ip UdpClient 编程 网络 TCP new 连接 string


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有