C#-Socket快速开始

本文详细解释了网络通信中的三个关键要素:数据作为传输信息的基本单位,协议定义数据传输规则,地址作为设备间的唯一标识。同时展示了使用Socket和TCP实现客户端与服务器通信的示例代码,包括数据的接收和发送过程以及Json的使用。
摘要由CSDN通过智能技术生成

网络通信三要素

数据、协议和地址,它们各自有以下作用:

  • 数据:是网络通信的基本单位,指在网络中传输的信息。数据可以是文本、图像、音频或视频等各种形式的信息。
  • 协议:是网络通信中的规则,它定义了数据在网络中的传输方式和处理方式。协议可以分为物理层协议、数据链路层协议、网络层协议、传输层协议和应用层协议等多种类型。
  • 地址:是网络中设备的唯一标识符,用于标识设备之间的通信。地址可以是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();

可以看见已经实现了通信。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥不爱码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值