从零开始学Socket:(二)连接服务端和客户端

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15020543/article/details/84026812

先了解一下线程问题,在Main函数里就是主线程他能处理代码,而new Thread就是新开一个线程,他和主线程互不干预,但是主线程完了,他也完了。他完了,主线程没事。

 

在上篇博客里,我们已经创建好了服务器端和客户端,但是他们俩还没有联系,要把他们联系起来,就需要在服务器端监听客户端连接。于是就有了BeginAccept函数。老规矩,在Socket从元数据里(刚刚F12进入的代码界面)查看说明,这里说的异步操作可以理解为新开一个线程。

callback:这个委托是当客户端连接到服务器时执行的回调函数,也就是说,当有客户端连接进来的时候,这个函数就会执行。

所以在StartServer函数添加异步接收客户端连接这一行代码

//异步接受客户端连接
serverSocket.BeginAccept(AcceptCallBack, serverSocket);

接下来是AcceptCallBack函数,先了解一下EndAccept函数

        /// <summary>
        /// 当客户端连接到服务器时执行的回调函数
        /// </summary>
        /// <param name="ar"></param>
        static void AcceptCallBack(IAsyncResult ar)
        {
            Console.WriteLine("一个客户端连接进来了。");
        }

我们要在Main函数里加上用来暂停的语句,不然运行起来就结束了,一闪而过,啥也看不见

            //暂停
            Console.ReadKey();

服务端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Server
{
    class Program
    {
        static Socket serverSocket;
        static void Main(string[] args)
        {
            StartServer();
            //暂停
            Console.ReadKey();
        }
        /// <summary>
        /// 开启一个Socket
        /// </summary>
        static void StartServer()
        {
            //实例化一个Socket
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //设置IP
            IPAddress ipAdress = IPAddress.Parse("127.0.0.1");

            //设置网络终结点
            IPEndPoint iPEndPoint = new IPEndPoint(ipAdress, 88);

            //绑定ip和端口号
            serverSocket.Bind(iPEndPoint);

            //等待队列(开始监听端口号)
            serverSocket.Listen(0);

            //异步接受客户端连接
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);

        }
        /// <summary>
        /// 当客户端连接到服务器时执行的回调函数
        /// </summary>
        /// <param name="ar"></param>
        static void AcceptCallBack(IAsyncResult ar)
        {
            Console.WriteLine("一个客户端连接进来了。");
        }

    }
}

客户端代码

using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace ClientTest
{
    class Program
    {
        //声明客户端
        static Socket clientSocket;
        static void Main(string[] args)
        {
            StartClient();
            Console.ReadKey();
        }
        /// <summary>
        /// 开启客户端并连接到服务器端
        /// </summary>
        static void StartClient()
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 88));
        }
    }
}

然后我们运行起来,先运行服务器端,再运行客户端

把项目设置为启动项

点击启动即可

运行结果,至此,就创立了客户端和服务器端的连接

猜你喜欢

转载自blog.csdn.net/qq_15020543/article/details/84026812