服务器异步客户端

这篇具有很好参考价值的文章主要介绍了服务器异步客户端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务器

//泛型单例

internal class Singleton<T>where T:class,new() {     private static T ins;     public static T Ins     {         get         {             if(ins == null)             {                 ins = new T();             }             return ins;         }     } }

//消息中心

internal class MessageManager<T>:Singleton<MessageManager<T>>
{
    Dictionary<int, Action<T>> MsgDic = new Dictionary<int, Action<T>>();
    public void OnAddListen(int id,Action<T> action)
    {
        if(MsgDic.ContainsKey(id))
        {
            MsgDic[id] += action;
        }
        else
        {
            MsgDic.Add(id, action);
        }
    }
    public void OnBroadCast(int id,T t)
    {
        if(MsgDic.ContainsKey(id))
        {
            MsgDic[id](t);
        }
    }
}

internal class Client
{
    public Socket socket;
    public byte[] data=new byte[1024];
}

internal class MsgData
{
    public Client cli;
    public byte[] data;
}

//服务器框架

internal class NetManager:Singleton<NetManager>
{
    Socket socket;
    //public List<Client> allcli=new List<Client>();
    public void InitServer()
    {
        socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Bind(new IPEndPoint(IPAddress.Any,2201));
        socket.Listen(10);
        Console.WriteLine("2201 服务器开启");
        socket.BeginAccept(OnAccept, null);
    }

    private void OnAccept(IAsyncResult ar)
    {
        try
        {
            Socket socket_cli=socket.EndAccept(ar);
            IPEndPoint iPEnd=socket_cli.RemoteEndPoint as IPEndPoint;
            Console.WriteLine("IP"+iPEnd.Address+"port"+iPEnd.Port+"连接上了");
            socket.BeginAccept(OnAccept, null);
            Client client=new Client();
            client.socket= socket_cli;
            //allcli.Add(client);
            client.socket.BeginReceive(client.data, 0, client.data.Length, SocketFlags.None, Receive, client);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }

    private void Receive(IAsyncResult ar)
    {
        try
        {
            Client client=ar.AsyncState as Client;
            int len=client.socket.EndReceive(ar);
            if(len>0)
            {
             
                byte[] rdata=new byte[len];
                Buffer.BlockCopy(client.data,0,rdata,0,len);
                while(rdata.Length>4)
                {
                    int bodylen=BitConverter.ToInt32(rdata, 0);
                    byte[] bodydata=new byte[bodylen];
                    Buffer.BlockCopy(rdata, 4, bodydata, 0, bodylen);

                    int msgid=BitConverter.ToInt32(bodydata, 0);
                    byte[] info=new byte[bodylen-4];
                    Buffer.BlockCopy(bodydata,4,info, 0, info.Length);

                    MsgData msgData = new MsgData();
                    msgData.cli = client;
                    msgData.data = info;
                    MessageManager<MsgData>.Ins.OnBroadCast(msgid, msgData);

                    int sylen = rdata.Length - 4 - bodylen;
                    byte[] sydata=new byte[sylen];
                    Buffer.BlockCopy(rdata,4+bodylen, sydata, 0, sylen);
                    rdata = sydata;
                }

            }
            client.socket.BeginReceive(client.data, 0, client.data.Length, SocketFlags.None, Receive, client);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
    public void OnSendServer(int id, byte[] data,Client client)
    {
        int head = 4 + data.Length;
        byte[] enddata=new byte[0];
        enddata = enddata.Concat(BitConverter.GetBytes(head)).Concat(BitConverter.GetBytes(id)).Concat(data).ToArray();
        client.socket.BeginSend(enddata, 0, enddata.Length, SocketFlags.None, Send, client);
    }

    private void Send(IAsyncResult ar)
    {
        Client client=ar.AsyncState as Client;
        int len = client.socket.EndSend(ar);
        Console.WriteLine("发给客户端消息"+len);
    }
}

客户端

public class NetManager : Singleton<NetManager>
{
    Socket socket;
    byte[] data=new byte[1024];

    Queue<byte[]> queue=new Queue<byte[]>();
    public void InitClient()
    {
        socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.BeginConnect("127.0.0.1", 2201, OnConnect, null);
    }

    private void OnConnect(IAsyncResult ar)
    {
        try
        {
            socket.EndConnect(ar);
            Debug.Log("连接成功");
            socket.BeginReceive(data, 0, data.Length, SocketFlags.None, OnReceive, null);
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
    }

    private void OnReceive(IAsyncResult ar)
    {
        try
        {
            int len =socket.EndReceive(ar);
            if (len > 0)
            {
                byte[] rdata = new byte[len];
                Buffer.BlockCopy(data, 0, rdata, 0, len);
                while (rdata.Length > 4)
                {
                    int bodylen = BitConverter.ToInt32(rdata, 0);
                    byte[] bodydata = new byte[bodylen];
                    Buffer.BlockCopy(rdata, 4, bodydata, 0, bodylen);

                    queue.Enqueue(bodydata);

                    int sylen = rdata.Length - 4 - bodylen;
                    byte[] sydata = new byte[sylen];
                    Buffer.BlockCopy(rdata, 4 + bodylen, sydata, 0, sylen);
                    rdata = sydata;
                }

            }
            socket.BeginReceive(data, 0, data.Length, SocketFlags.None, OnReceive, null);
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
    }
    public void NetUpdata()
    {
        if(queue.Count > 0)
        {
            byte[] bodydata=queue.Dequeue();
            int msgid=BitConverter.ToInt32(bodydata, 0);
            byte[] info=new byte[bodydata.Length-4];
            Buffer.BlockCopy(bodydata, 4, info, 0, info.Length);
            MessageManager<byte[]>.Ins.OnBroadCast(msgid, info);

        }
    }

    public void OnSendClient(int id, byte[] data)
    {
        int head = 4 + data.Length;
        byte[] enddata=new byte[0];
        enddata = enddata.Concat(BitConverter.GetBytes(head)).Concat(BitConverter.GetBytes(id)).Concat(data).ToArray();
        socket.BeginSend(enddata, 0, enddata.Length, SocketFlags.None, OnSend, null);
    }

    private void OnSend(IAsyncResult ar)
    {
        int len = socket.EndSend(ar);
        Debug.Log("发给服务器消息"+len);
    }
}文章来源地址https://www.toymoban.com/news/detail-845522.html

到了这里,关于服务器异步客户端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

    TCP服务器与客户端的搭建需要借助以下API ServerSocket 是创建TCP服务端Socket的API。 ServerSocket 构造方法 : 方法签名 方法说明 ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定到指定端口 ServerSocket 方法: 方法签名 方法说明 Socket accept() 开始监听指定端口(创建时绑定的端

    2024年03月12日
    浏览(80)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(59)
  • Java分别用BIO、NIO实现简单的客户端服务器通信

    前言: Java I/O模型发展以及Netty网络模型的设计思想 Java BIO是Java平台上的BIO(Blocking I/O)模型,是Java中用于实现同步阻塞网络编程的一种方式。 在Java中,使用BIO模型需要通过Socket和ServerSocket类来完成网络连接和数据传输,但是由于BIO是同步阻塞的,所以会导致线程阻塞和资

    2024年02月09日
    浏览(42)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(70)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(47)
  • Java 中,使用 HttpServletResponse 对象将服务器上的文件响应到客户端浏览器进行下载

    在服务器端,使用 FileInputStream 打开要下载的文件,并将其读取到字节数组中。 2.设置 HttpServletResponse 的响应头信息,告诉浏览器需要下载文件,并指定文件名和文件类型 其中,Content-Type 表示响应内容的类型,这里设置为 application/octet-stream,表示二进制流。Content-Length 表示

    2024年02月13日
    浏览(67)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(64)
  • java静默打印PDF(可实现生产环境下服务器写入PDF模板,然后调用客户端打印机打印)

    需求 写这个的原因主要是因为当时项目中的打印功能是用户打印标签时,每次点击打印是通过把PDF文件下载到客户端浏览器,然后需要通过浏览器去点击打印机实现打印,就非常麻烦,每次都步骤非常复杂,而且每次参数都要重新设置。于是就想着怎么通过java实现自己调用

    2024年02月13日
    浏览(47)
  • UDP客户端和服务器

    UDP客户端,也就是首先主动发送数据的一方,也就是发起服务请求的一方。 UDP服务器,也就是首先等待接收数据,并对接收的数据进行处理,返回计算结果的一方,也就是提供服务的一方。 在下面实验中使用到的函数 测试代码  UDP接收端(服务器) 执行代码:    实验解析 

    2024年02月13日
    浏览(89)
  • UDP通讯(服务器/客户端)

    前言:UDP通讯实现比较简单,单某些情况下也会使用,建议先看一下说明,然后运行代码感受一下。         传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但U

    2024年02月03日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包