网络通信的基本知识:
首先应该确定IP地址和端口号,端口号为了确定计算机的哪个进程,比如同一主机是微信还是qq通信
要进行通信首先应该确定一种协议,通常用TCP可靠和UDP不可靠协议,当然带来的速度也会不同,多数游戏中采用TCP协议。
面向连接套接字通信步骤:
服务端:
先申请一个Socket,绑定一个IP地址和端口,开始接听,等待接受连接。
客户端:
申请一个Socket,连接服务器且指定IP和端口号
值得注意的是,服务端有两个Socket,一个用于监听,另一个和客户端进行通信。
服务器端代码:
using System.Net.Sockets; using System.Net; using System.Threading; namespace Socket套接字 { class SocketT { private Socket _ServerSocket; //服务器监听套接字 private bool _IsListionContect; //是否在监听 public SocketT() { //定义网络终节点(封装IP和端口) IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1000); //实例化套接字 _ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //服务端绑定地址 _ServerSocket.Bind(endPoint); //开始监听 _ServerSocket.Listen(10); //监听的最大长度 Console.WriteLine("服务器已经启动..."); try { while (_IsListionContect) { //Accept()方法接受客户端的连接,这个方法会阻断当前线程的运行 Socket sockMsgSever = _ServerSocket.Accept(); Console.WriteLine("有一个客户端连接..."); //开启后台线程,进行客户端会话 Thread thClientMsg = new Thread(ClientMsg); thClientMsg.IsBackground=true; //设置为后台线程 thClientMsg.Name = "thClientMsg"; thClientMsg.Start(sockMsgSever); } } catch (Exception) { throw; } } /// <summary> /// 服务器端和客户端通信的后天线程 /// </summary> /// <param name="?"></param> private void ClientMsg(object sokMsg) { Socket socketMsg = sokMsg as Socket; //将object类型转换为Socket通信 while (true) { //准备一个数据缓存 byte[] msyArray = new byte[0124 * 0124]; //接受客户端发来的请求,返回真实的数据长度 int TrueClientMsgLenth = socketMsg.Receive(msyArray); //byte数组转字符串 string strMsg = Encoding.UTF8.GetString(msyArray, 0, TrueClientMsgLenth); //显示客户端数据 Console.WriteLine("客户端数据:"+strMsg); } } static void Main(string[] args) { SocketT obj = new SocketT(); } } }
客户端:
using System.Threading; using System.Net; using System.Net.Sockets; namespace Socket套接字_客户端 { class Client { private Socket _ClientSocket; //客户端通讯套接字 private IPEndPoint SeverEndPoint; //连接到服务器端IP和端口 public Client() { //服务器通信地址 SeverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000); //建立客户端Socket _ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { _ClientSocket.Connect(SeverEndPoint); } catch (Exception) { } Console.WriteLine("连接服务器端成功!"); } //连接服务器 public void SendMsg() { while (true) { //输入信息 string strMsg = Console.ReadLine(); //退出 if (strMsg == "exit") { break; } //字节转换 Byte[] byeArray = Encoding.UTF8.GetBytes(strMsg); //发送数据 _ClientSocket.Send(byeArray); Console.WriteLine("我:" + strMsg); } //关闭连接 _ClientSocket.Shutdown(SocketShutdown.Both); //清理连接资源 _ClientSocket.Close(); } static void Main(string[] args) { Client obj = new Client(); obj.SendMsg(); } } }