源码如下:
ipe = new IPEndPoint(IPAddress.Parse(serverIP), port);
sokCliet = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sokCliet.Connect((IPEndPoint)ipe);
while (true)
{
byte[] result = new byte[1024];
DateTime time = DateTime.Now;
ssd = sokCliet.Receive(result);
lock (sokCliet)
{
shu = Encoding.ASCII.GetString(result, 0, ssd);
}
Console.WriteLine(string.Format("{0:yyyy/MM/dd HH:mm:ss}", time) + "接受的信息:{0}\n", shu);
}
当网络丢包延迟过高时 接受的信息不完整 或粘包 怎么处理这等情况
------解决思路----------------------
这得自己去处理这些问题
还有 你那里是单线程的 你lock干嘛?。。
还有 远程异常断开的时候 有不会报异常 而Recevie方法会不停的返回 0 然后 你就真的进入死循环了
------解决思路----------------------
示例代码这么写可以,实际用不行
1。实际通讯过程中要做好异常处理,
每一次Receive都有可能失败,一旦失败就要跳出循环接收,重新连接server
所以while一层是不行的;
2。数据接收和数据解析要分离,否则会导致效率低下,
大致思路是接收数据后直接放入线程安全的队列中,立即返回;
数据解析由另外线程来处理
------解决思路----------------------
我写过一个例子:http://bbs.csdn.net/topics/390987992
所谓“沾包”,是从底层的 tcp 基本机制中拿来的词儿。tcp 从底层就是流式处理的(而不是块处理的),因此反映到上层.net层,沾包也是很自然地。你从 stream 以字节方式读取文本行,也是要连续读取,直到看到行结束符才知道读取了完整的一行的。对于 stream 方式的读取操作纠结于“沾包”,是因为编程太少的缘故。
这本来是一个低级的stream机制的“自然的”特征,只有当你自己去封装为更高级的组件时,才能隐蔽这个特征。
在高并发的处理中,写什么 while 循环,其实是软件程序设计的大忌。原本用20M内存、10几个(线程池中轮流分配的)线程就能处理成千上万的长连接的程序,如果被你这样来实现,那么就要用10G内存、几千个线程轮询占用cpu调度时间,自然是坑爹的服务程序了。但是对于初学者,顶多也就是写个“玩玩儿”的代码,丝毫不讲究实用,只看单机的眼前的“练习题”这么近的举例,那么也就算了。