代码写到35岁 2024-03-22 13:32 采纳率: 9.1%
浏览 16

使用HPSocket.Net方式进行通信OnReceive回调无法捕捉到消息

项目使用
C# WebApi 作为Socket的服务端,C# 窗体应用程序作为Socket的客户端,链接成功,但是发送消息,对方的OnReceive方法无法监听到,不管使服务端发消息,客户端监听捕捉还是客户端发消息,服务端捕捉 都无法实现?帮忙看下使什么原因,使用的C# 组件 HPSocket.Net
具体代码如下:
WebApi Socket服务端代码:

 private readonly ICadAndOssService _cadAndOssService;
 private  TcpServer _hpServer;

 /// <summary>
 /// 链接的id.
 /// </summary>
 public IntPtr commonconnId;

 /// <summary>
 /// 构造函数.
 /// </summary>
 /// <param name="cadAndOssService">cad service.</param>
 public CadAndOssController(ICadAndOssService cadAndOssService) 
 {
     _cadAndOssService = cadAndOssService;


     _hpServer = new TcpServer();
     //_hpServer.Address = "127.0.0.1";// 设置服务端IP
     //_hpServer.Port = Convert.ToUInt16(4000);// 设置端口
     //_hpServer.SendPolicy = SendPolicy.Pack;
     //_hpServer.Start();
 }

 /// <summary>
 /// 启动Socket服务
 /// </summary>
 /// <returns></returns>
 [Route("StartServe")]
 [HttpPost]
 public string StartServe()
 {

     _hpServer.OnPrepareListen += OnPrepareListen;
     _hpServer.OnAccept += OnAccept; //连接事件
     _hpServer.OnClose += OnClose;   //断开连接事件
     _hpServer.OnReceive += OnReceive;// 接收数据
     _hpServer.OnSend += OnSend;// 发送数据

     _hpServer.Address = "127.0.0.1";// 设置服务端IP
     _hpServer.Port = Convert.ToUInt16(4000);// 设置端口
     _hpServer.SendPolicy = SendPolicy.Pack;
     _hpServer.Start();

     // 发送数据
     return "服务端已开启并监听";

 }


 /// <summary>
 /// Socket 发送消息.
 /// </summary>
 /// <returns></returns>
 [Route("SocketSendMessage")]
 [HttpPost]
 public string SocketSendMessage()
 {
     string ss = "测试一下啊啊啊啊";
     byte[] bytes = System.Text.Encoding.UTF8.GetBytes(ss);
     uint ConnectionCount = _hpServer.ConnectionCount;
     var ConnectionIds = _hpServer.GetAllConnectionIds();
     if (ConnectionIds.Count() != 0)
     {
         commonconnId = ConnectionIds[0];
     }
     try
     {
         // hpServer.ResumeReceive(commonconnId);
         _hpServer.Send(commonconnId, bytes, ss.Length);
        // hpServer.ResumeReceive(commonconnId);
     }
     catch(Exception ex)
     {
         LogHelper.SetErrorLog($"Socket通信发送信息异常:{ex.Message}");
     }
     return "发送消息";
 }

 /// <summary>
 /// 打开监听
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="listen"></param>
 /// <returns></returns>
 private HandleResult OnPrepareListen(IServer sender, IntPtr listen)
 {
     return HandleResult.Ok;
 }

 /// <summary>
 /// 连接事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="connId"></param>
 /// <param name="client"></param>
 /// <returns></returns>
 private HandleResult OnAccept(IServer sender, IntPtr connId, IntPtr client)
 {
     // 获取客户端地址
     if (!sender.GetRemoteAddress(connId, out var ip, out var port))
     {
         return HandleResult.Error;
     }


     commonconnId = connId;
     return HandleResult.Ok;
 }


 /// <summary>
 /// 服务器收到数据
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="connId"></param>
 /// <param name="data"></param>
 /// <returns></returns>
 private HandleResult OnReceive(IServer sender, IntPtr connId, byte[] data)
 {
     try
     {
         string str = System.Text.Encoding.UTF8.GetString(data);
         return HandleResult.Ok;
     }
     catch (Exception)
     {
         return HandleResult.Ignore;
     }
 }

 /// <summary>
 /// 发送数据
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="connId"></param>
 /// <param name="data"></param>
 /// <returns></returns>
 private HandleResult OnSend(IServer sender, IntPtr connId, byte[] data)
 {
     try
     {
         return HandleResult.Ok;
     }
     catch (Exception)
     {
         return HandleResult.Ignore;
     }
 }

 /// <summary>
 /// 服务器关闭连接
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="connId"></param>
 /// <param name="socketOperation"></param>
 /// <param name="errorCode"></param>
 /// <returns></returns>
 private HandleResult OnClose(IServer sender, IntPtr connId, SocketOperation socketOperation, int errorCode)
 {
     return HandleResult.Error;
 }

 /// <summary>
 /// 服务器关闭
 /// </summary>
 /// <param name="sender"></param>
 /// <returns></returns>
 private HandleResult OnShutdown(IServer sender)
 {

     return HandleResult.Ok;
 }

C# 窗体程序 Socket 客户端的代码如下:


    public partial class FormManager : Form
    {
        TcpClient hpClient = new TcpClient();
        bool tcp1State = false;
        public FormManager()
        {
            InitializeComponent();


            // 设置连接回调事件  
            hpClient.OnConnect += OnConnect;
            hpClient.OnReceive += OnReceive;
            hpClient.OnClose += OnClose;

            //hpClient.Address = "127.0.0.1"; // 服务端ip
            //hpClient.Port = Convert.ToUInt16(4000); // 通信监听的端口
            //hpClient.BindAddress = "127.0.0.1"; // 客户端本机的ip
            //hpClient.BindPort = Convert.ToUInt16(7983); // 客户端本机的端口
            //hpClient.Connect();
        }


        /// <summary>
        /// 连接回调.
        /// </summary>
        /// <param name="client"></param>
        /// <returns></returns>
        public HandleResult OnConnect(IClient client)
        {
            return HandleResult.Ok;
        }

        /// <summary>
        /// 接收消息的回调方法.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public HandleResult OnReceive(IClient client, byte[] data)
        {
            // e.Data 包含接收到的数据  
            string message = System.Text.Encoding.UTF8.GetString(data);

            if (message.Equals("HEART"))
            {
                // 识别到心跳消息,选择忽略  
                return HandleResult.Ok;
            }

            Console.WriteLine("Received from server: " + message);
            return HandleResult.Ok;
            // 在这里处理接收到的消息...  
        }

        /// <summary>
        /// 关闭连接回调.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="socketOperation"></param>
        /// <param name="errorCode"></param>
        /// <returns></returns>
        public HandleResult OnClose(IClient sender, SocketOperation socketOperation, int errorCode)
        {
            return HandleResult.Ok;
        }

        private void btn_conect_Click(object sender, EventArgs e)
        {
            hpClient.Address = "127.0.0.1"; // 服务端ip
            hpClient.Port = Convert.ToUInt16(4000); // 通信监听的端口
            hpClient.BindAddress = "127.0.0.1"; // 客户端本机的ip
            hpClient.BindPort = Convert.ToUInt16(7983); // 客户端本机的端口
            bool ConnectResult = hpClient.Connect();
            hpClient.ConnectionTimeout = 1000 * 1000;

            // hpClient.KeepAliveInterval = 10;
            // hpClient.KeepAliveTime = 1000 * 5;
            hpClient.PauseReceive = ReceiveState.Resume;
            this.txt_content.Text = hpClient.IsConnected == true ? "连接" : "未连接";
        }

        private void btn_state_Click(object sender, EventArgs e)
        {
            this.txt_content.Text = hpClient.IsConnected == true ? "连接" : "未连接";
            this.txt_content.Text += hpClient.HasStarted == true ? "启动" : "未启动";
            this.txt_content.Text += hpClient.State.ToString();

        }

        private void btn_send_Click(object sender, EventArgs e)
        {
            string ss = "客户端测试一下啊啊啊啊";
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(ss);
            var result = hpClient.Send(bytes, bytes.Length);
        }
    }
  • 写回答

3条回答 默认 最新

  • 赵4老师 2024-03-22 16:07
    关注

    关闭防火墙

    评论

报告相同问题?

问题事件

  • 创建了问题 3月22日

悬赏问题

  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计