因为在前几天,我已经花了不少的时间在fishingJoy上面的,在这里就不写了,由于在写一遍也没有什么做用。c#
今天咱们正式开始网络部分的学习,在这个网络的部分咱们直接是使用c#中的socket来开发的,全部,这样就会更加直接,相对于用框架而言。如其余的类同样,vs也把网络部分封装成一个类,这样就大大减小了咱们开发的难度。在此以前,咱们仍是有必要来了解一下网络部分的基础知识。就是IP与端口号。服务器
网络之间互连的协议也就是为计算机网络相互链接进行通讯而设计的协议。在因特网中,它是能使链接到网上的全部计算机网络实现相互通讯的一套规则,规定了计算机在因特网上进行通讯时应当遵照的规则。任何厂家生产的计算机系统,只要遵照IP协议就能够与因特网互连互通。IP地址具备惟一性,根据用户性质的不一样,能够分为5类。另外,IP还有进入防御,知识产权,指针寄存器等含义。网络
在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用 于链接其余网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,好比用于浏览网页服务的80端口,用于FTP服务的21端口等。因为物理端口和逻辑端口数量较多,为了对端口进行区分,将每一个端口进行了编号,这就是端口号框架
以上就是有关IP与端口号的解释,咱们对于这个只要知道一下就好了,IP与端口号绑定才能上网。socket
说到网络链接,咱们只要要讲到TCP的三次握手,与四次挥手。只有完成三次握手,客户端与服务器端才能进行通讯。只有完成四次挥手,客户端与服务器端才能完成断开链接,不然会报错。函数
咱们首先建立一个解决方案,叫TCP服务器端,要注意的一点就是是客户端端向服务器端发起请求。学习
//实例化服务器端 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //得到IP地址 IPAddress iPAddress = IPAddress.Parse("127.0.0.1"); //端口号与IP地址 IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 88); //服务器端绑定IP地址与端口号 serverSocket.Bind(iPEndPoint); serverSocket.Listen(0);
首先建立一个服务器的socket类,将其中的类型,写好,在其中设定IP地址与端口号,并进行绑定。spa
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
接着就是开始接受,注意的是这里须要有一个回调函数,接着计算机网络
static void AcceptCallBack(IAsyncResult ar) { Socket serverSocket = ar.AsyncState as Socket; Socket clientSocket = serverSocket.EndAccept(ar); string msg = "Hello Client 您好..."; byte[] data = Encoding.UTF8.GetBytes(msg); clientSocket.Send(data); clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket); serverSocket.BeginAccept(AcceptCallBack, serverSocket); }
开始写回调函数,将用于返回的socket定义成服务器socket,将结束接受并传来的socket定义成客服端socket,服务器端向客户端发送一个信息,表示已经正常链接了,接受客户端向服务器端传送信息,就是begin receive方法。可是这个方法也是须要回调函数的,因此咱们还要写设计
static void ReceiveCallBack(IAsyncResult ar) { Socket clientSocket = null; try { clientSocket = ar.AsyncState as Socket; int count = clientSocket.EndReceive(ar); if (count == 0) { clientSocket.Close(); return; } string msg = Encoding.UTF8.GetString(dataBuffer, 0, count); Console.WriteLine("从客户端接受到的数据:" + msg); clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket); } catch (Exception e) { Console.WriteLine(e); if (clientSocket != null) { clientSocket.Close(); } } }
若是你在方法中穿的是什么,那个这个AsyncState的类型就是什么,获得客户端发送结束的信息,并把它说出,由于客户端有可能屡次的发送数据,因此咱们须要在其中在写调用本身的方法,这样,就能够再次输出数据的了,前面的再次调用接受也是同样的,这样写的是为了能够接受多个客户端。接下来:
static void Main(string[] args) { ServerAsync(); Console.ReadKey(); }
以上是服务器端的部分,接下来就是客户端的部分了。
前面的基本操做也是同样的:
static void Main(string[] args) { //建立客户端的的socket类 Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //与客户端的进行绑定 clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 88)); byte[] data = new byte[1024]; int count = clientSocket.Receive(data); string msg = Encoding.UTF8.GetString(data, 0, count); Console.Write(msg); while (true) { string s = Console.ReadLine(); if (s == "c") { clientSocket.Close(); return; } //向客户端发送信息 clientSocket.Send(Encoding.UTF8.GetBytes(s)); } Console.ReadKey(); clientSocket.Close(); }
其实就是这么多。咱们要注意的是 127.0.0.1是主机就是localhost。今天的部分就是这么多。