异步Socket聊天框学习笔记

服务端

using System.Net.Sockets;
using System;

public class Connect
{
    //套接字
    public Socket socket;
    //缓存区
    public const int Buff_Size = 1024;
    public byte[] buff = new byte[Buff_Size];
    public int buffCount = 0;
    //是否被启用
    public bool isUse = false;

    //构造函数
    public Connect()
    {
        buff = new byte[Buff_Size];
    }
    //初始化
    public void Init(Socket socket)
    {
        this.socket = socket;
        isUse = true;
        buffCount = 0;
    }

    //缓冲区剩余大小
    public int BuffRemain()
    {
        return Buff_Size - buffCount;
    }
    //客户端地址
    public string GetAdress()
    {
        if(!isUse)
        {
            return "无法获取地址";
        }

        return socket.RemoteEndPoint.ToString();
    }
    //关闭
    public void Close()
    {
        if (!isUse)
        {
            return;
        }

        Console.WriteLine(GetAdress()+"与服务器断开连接");
        socket.Close();
        isUse = false;
    }
}

using System;
using System.Net;
using System.Net.Sockets;

public class SeverNet
{
    //套接字
    public Socket socketlisen;
    //连接池
    public const int MaxSize = 50;
    public Connect[] conns;

    //返回连接池引用,如果没有则返回-1
    public int NewIndex()
    {
        if (conns == null)
            return -1;
        for(int i = 0; i<conns.Length;i++)
        {
            if (conns[i] == null)
            {
                conns[i] = new Connect();
                return i;
            }         
            else if (conns[i].isUse == false)
                return i;
        }
        return -1;
    }
    //启动
    public void Start(string ip, int port)
    {
        //初始化连接池
        conns = new Connect[MaxSize];
        for (int i = 0; i < MaxSize; i++)
        {
            conns[i] = new Connect();
        }

        //初始化Socket
        socketlisen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //Bind
        IPAddress ipAr = IPAddress.Parse(ip);
        IPEndPoint ipEP = new IPEndPoint(ipAr,port);
        socketlisen.Bind(ipEP);
        //设置最大监听数
        socketlisen.Listen(MaxSize);
        //Accept
        socketlisen.BeginAccept(AcceptCb,null);
        Console.WriteLine("服务器启动成功!");
    }
    //回调
    private void AcceptCb(IAsyncResult ar)
    {
        try
        {
            Socket socket = socketlisen.EndAccept(ar);
            int index = NewIndex();
            //Console.WriteLine("Index:"+index);
            if (index < 0)
            {
                socket.Close();
                Console.WriteLine("连接池已满");
            }
            else
            {
                //为客户端分配连接池
                Connect conn = conns[index];
                conn.Init(socket);
                string adr = conn.GetAdress();
                Console.WriteLine("连接到:"+adr+"  号码:"+index);
                //异步接收客户端数据
                conn.socket.BeginReceive(conn.buff,conn.buffCount,conn.BuffRemain(),SocketFlags.None,ReceiveCb,conn);
            }
            socketlisen.BeginAccept(AcceptCb,null);
        }
        catch(Exception e)
        {
            Console.WriteLine("连接失败:"+e.Message);
        }
    }
    //接收回调
    private void ReceiveCb(IAsyncResult ar)
    {
        Connect conn = (Connect)ar.AsyncState;
        try
        {
            int count = conn.socket.EndReceive(ar);//接收到的字节数
            //如果没有收到消息说明连接断开
            if(count<=0)
            {
                Console.WriteLine("收到["+conn.GetAdress()+"]断开连接");
                conn.Close();
                return;
            }
            string str = System.Text.Encoding.UTF8.GetString(conn.buff,0,count);
            Console.WriteLine("收到[" + conn.GetAdress() + "]的信息:" + str);

            //广播
            str ="[" + conn.GetAdress() + ":]" + str;
            byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
            for(int i = 0;i<conns.Length;i++)
            {
                if(conns[i]==null || !conns[i].isUse)
                {
                    continue;
                }
                Console.WriteLine("将消息传播给:"+conns[i].GetAdress());
                conns[i].socket.Send(bytes);
            }
            //继续接收
            conn.socket.BeginReceive(conn.buff,conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn);
        }
        catch(Exception e)
        {
            Console.WriteLine("服务器与["+conn.GetAdress()+"]断开连接!");
            conn.Close();
        }
    }
}
 

using System;

public class MainClient
{
    public static void Main(String[] args)
    {
        //开启服务端
        Console.WriteLine("启动服务器!");
        SeverNet ser = new SeverNet();
        ser.Start("127.0.0.1",1234);

        while(true)
        {
           switch(Console.ReadLine())
            {
                case "quit":
                    return;
            }  
        }       
    }
}
 

客户端

using UnityEngine;
using UnityEngine.UI;
using System.Net.Sockets;
using System;

public class Sys : MonoBehaviour
{
    //收到的消息
    public Text ReceiveText;
    private string ReceiveStr;

    //发送的消息
    public InputField SendInputField;

    //本地ip
    public Text LocalEndPoint;

    private Socket socket;
    //缓存
    private const int Buff_Size = 1024;
    private byte[] buffBytes = new byte[Buff_Size];
    //private int buffCount;

    public Button link;
    public Button send;
    private void Start()
    {
        link.onClick.AddListener(Connection);
        send.onClick.AddListener(Send);
    }
    private void Update()
    {
        ReceiveText.text = ReceiveStr;
    }
    public void Connection()
    {
        ReceiveStr = "";
        //连接服务器
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        socket.Connect("127.0.0.1",1234);
        LocalEndPoint.text = socket.LocalEndPoint.ToString();

        //接收消息
        socket.BeginReceive(buffBytes,0,Buff_Size,SocketFlags.None,ReceiveCb,null);
    }
    //异步回调
    private void ReceiveCb(IAsyncResult ar)
    {
        try
        {
            int count = socket.EndReceive(ar);
            string str = System.Text.Encoding.UTF8.GetString(buffBytes, 0, count);

            if (ReceiveStr.Length > 300) ReceiveStr = "";
            ReceiveStr = "收到的消息为:" + str;

            socket.BeginReceive(buffBytes, 0, Buff_Size, SocketFlags.None, ReceiveCb, null);
        }
        catch (Exception e)
        {
            ReceiveStr = "连接已断开";
            socket.Close();
        }
    }
    private void Send()
    {
        string str = SendInputField.text;
        byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
        try
        {
            socket.Send(bytes);
        }
        catch
        {

        }
    }   
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值