先了解一下线程问题,在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));
}
}
}
然后我们运行起来,先运行服务器端,再运行客户端
把项目设置为启动项
点击启动即可
运行结果,至此,就创立了客户端和服务器端的连接