双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

Socket 传输问题,各店帮忙看看。

Water Lee Water Lee 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
自己写了个socke传数据,一直用着都挺正常的。但今天遇到传输较大字符串时,出现有时出错,有时正确的情况,大概率出错,小概率正确,各店位帮忙看看哪里有问题?
客户端连接接收数据主要代码
 public void Connect(string conIP, int conPort, DoServerBack ServerBackDeel, string strData)
{
//创建套接字
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
doServerBack = ServerBackDeel;
//开始连接到服务器
try
{
//连接指定服务器
client.Connect(conIP, conPort);
if (client.Connected)
{//连接成功
//向服务器发送服务请求
//因为传输时结束字符串可能被截为两段,所以结束符多发一次,以保证服务器收到结束符
//SendMessage("DATESTART" + strData + "DATEENDDATEEND");
SendMessage(strData);
//开始接收服务器返回结果
client.BeginReceive(receiveBuffer, 0, receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
}
else
{//连接失败
client.Close();
}
}
catch (Exception ex)
{
client.Close();
//如果显示提示,那么在后台静默等待服务器开启时
//就会出现显示即程序暂停的情况
}
}

/// <summary>
/// 接收数据调用方法
/// </summary>
/// <param name="ar"></param>
private void ReceiveCallBack(IAsyncResult ar)
{
try
{
if (client.Connected)
{
byteSource.AddRange(receiveBuffer);//接收数据
//检查数据中是否有结尾标记
int REnd = client.EndReceive(ar);
string strReceiveData = Encoding.UTF8.GetString(receiveBuffer, 0, REnd);
if (!string.IsNullOrEmpty(strReceiveData))
{//如果字符串不为空
//检测结束符
int endloc = strReceiveData.IndexOf("DATEEND");
if (endloc > 0)
{//接收数据结束
ReciveData = Encoding.UTF8.GetString(byteSource.ToArray());
int start = ReciveData.IndexOf("DATESTART") + "DATESTART".Length;
int end = ReciveData.IndexOf("DATEEND");
ReciveData = ReciveData.Substring(start, end - start);
//实际使用中发现会出现数据传输错误,故加入哈希验证,减少错误数据读取率
string[] resultData = ReciveData.Split('\f');
if (Cls_WaterSocketMessage.GetHashValue(resultData[0]) == resultData[1])
{//哈希值字符串比较
doServerBack(resultData[0]);
}
else
{
doServerBack("FALSE");
}
timeoutObject.Set();//这里设置结果超时控制的阻塞
}
}
//this.HandleMessage(strReceiveData);
if (client.Connected)
{
client.BeginReceive(receiveBuffer, 0, receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
}
}
}
catch (Exception ex)
{
//System.Windows.Forms.MessageBox.Show("ReceiveCallBack " + ex.Message);
}
}

服务器端发送数据代码
public void SendMessage(Socket s, string ms)
{
if (!s.Poll(500, SelectMode.SelectRead))
{
s.Send(Encoding.UTF8.GetBytes(
"DATESTART" //报文开头
+ ms //报文内容
+ "\f" //报文与其哈希值的分隔符
+ Cls_WaterSocketMessage.GetHashValue(ms) //报文内容的哈希值
+ "DATEENDDATEEND"));
}
}


出错时,我都是在传文件,几百K到几M不等。我断点查了下,每次不成功都是在哈希验证时出错。关键的关键是,有时候又能正常传输,
各店帮忙看看吧。无力了
当然,如果哪位能直接给个可以正常使用的SOCKET代码就不胜感激了。
...全文
评论 32
收藏 已收藏
分享
返回顶部
Water Lee
C# 111,129 成员 642,540 内容