项目使用
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);
}
}