网络通信三要素
数据、协议和地址,它们各自有以下作用:
- 数据:是网络通信的基本单位,指在网络中传输的信息。数据可以是文本、图像、音频或视频等各种形式的信息。
- 协议:是网络通信中的规则,它定义了数据在网络中的传输方式和处理方式。协议可以分为物理层协议、数据链路层协议、网络层协议、传输层协议和应用层协议等多种类型。
- 地址:是网络中设备的唯一标识符,用于标识设备之间的通信。地址可以是MAC地址、IP地址、域名等多种类型。
快速开始
准备工作,鼠标右键,在 NuGet包中导入LitJson
NetworkServer.cs
public class NetworkServer
{
public delegate void CallBack();
Socket socket;
public void InitSocket(int port)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定端口
socket.Bind(new IPEndPoint(IPAddress.Any, port));
//连接队列并发
socket.Listen(0);
//客户端连接
StartAccept();
}
void StartAccept()
{
//接收连接,执行回调函数
socket.BeginAccept(AcceptCallback, null);
}
//当有客户端连接后执行
private void AcceptCallback(IAsyncResult ar)
{
//实例化连接的客户端
Socket client = socket.EndAccept(ar);
Console.WriteLine("客户端连接进入");
//接收客户端,返回客户端的消息
string data = Receive(client);
//发送消息(传入当前的客户端,客户端的消息)
Send(client, data);
//接收其他客户端的连接
StartAccept();
}
public string Receive(Socket client, CallBack callBack = null)
{
//用来存储接收服务端的byte[]
byte[] buffer = new byte[1024];
//接收到的长度
int length = client.Receive(buffer);
//将接收的转回字符串
string data = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收客户端消息" + data);
return data;
}
public void Send(Socket client, string verifyData)
{
string sendMessage = verify(verifyData).ToString();
/*string sendMessage = string.Format("test");*/
byte[] data = Encoding.UTF8.GetBytes(sendMessage);
client.Send(data);
Console.WriteLine("向客户端发送的消息:{0}", sendMessage);
}
int verify(string data)
{
//解析客户端传过来的Json
JsonData json = JsonMapper.ToObject(data);
Console.WriteLine("向客户端发送的消息:{0}{1}", json["ID"]["user"].ToJson(), json["ID"]["password"].ToJson());
if (json["ID"]["user"].ToString() == "huang" && json["ID"]["password"].ToString() == "123")
{
return 200;
}
else
{
return 0;
}
}
NetworkClient.cs
public class NetworkClient
{
//回调函数
public delegate void CallBack();
Socket socket;
//初始化Socket
public void InitClient()
{
//实例化Socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse("127.0.0.1");
//创建网络端口包括ip和端口
IPEndPoint endPoint = new IPEndPoint(address, 1314);
//建立连接
socket.Connect(endPoint);
//如果没有连接跳出运行
if (!socket.Connected)
{
return;
}
//向服务端发送消息
Send();
//接收服务端消息
Receive();
}
public void Send(CallBack callBack = null)
{
//键盘输入user,password
string user = Console.ReadLine();
string password = Console.ReadLine();
//用LitJson转Json进行传递
JsonData jd = new JsonData();
jd["ID"] = new JsonData();//**新添加一层关系时,需要再次 new** JsonData()
jd["ID"]["user"] = user;
jd["ID"]["password"] = password;
/*
{
"ID":{
"user":"huang",
"password":"123"
}
}
*/
string jsonData = JsonMapper.ToJson(jd);
//将jsonData转成byte[]
byte[] data = Encoding.UTF8.GetBytes(jsonData);
//向服务端发送data
socket.Send(data);
Console.WriteLine("向服务发送的消息:{0}", jsonData);
//回调函数不为空,执行callBack()
if (callBack != null)
{
callBack();
}
}
//接收服务端的消息
public void Receive()
{
//用来存储接收服务端的byte[]
byte[] buffer = new byte[1024];
//接收到的长度
int length = socket.Receive(buffer);
//将接收的转回字符串
string data = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收服务端{0},消息{1}" + data);
if (data == "200")
{
Console.WriteLine("登陆成功!!!");
}
else
{
Console.WriteLine("登陆失败!!!");
}
}
NetworkServer和NetworkClient的port端口号要一致。
在NetworkServer程序入口添加
NetworkServer networkServer = new NetworkServer();
//port端口号 1314
networkServer.InitSocket(1314);
在NetworkClient程序入口添加
NetworkClient networkClient = new NetworkClient();
networkClient.InitClient();
可以看见已经实现了通信。