日期:2014-05-20  浏览次数:21012 次

SOCKET清除端口数据问题
我用socket往服务器某个端口发送数据,服务器段接受数据后,将端口数据清空,怎么办呢?请高手指点!

------解决方案--------------------
smessage += srread.ReadLine();//
这句相当于数据读完了。流里面的指针会下移。
------解决方案--------------------
do
{
smessage += srread.ReadLine();//
}
while(smessage != "end ")

------解决方案--------------------
没用过TcpClient,但是我觉得应该把这两句也放到循环内

nsstream = tcclient.GetStream ( ) ; //private static NetworkStream nsstream; srread=new StreamReader(nsstream); //private static StreamReader srread;

------解决方案--------------------
不好意思,我上面说的不对

试试用seek方法移动到stream的指定位置
------解决方案--------------------
在需要正式读取数据前,先判断缓冲区有多少数据(Available属性),如果> 0,先把缓冲区数据读掉。然后再等到Available属性> 0时候再读取你所需要的数据。
------解决方案--------------------
我提个思路,首先你客户端发送数据每个帧应该有个时间间隔,这个时间就是帧间间隔时间。服务器端接收数据应该根据这个帧间间隔来接收每一帧,而不是清空原来所有数据来接收
------解决方案--------------------
客户端在每次发送完数据后
调用StreamWriter.Flush()函数试下

------解决方案--------------------
函数recv( SOCKET s, char FAR *buf, int len, int flags )
参数flags的值可为0或MSG_PEEK、MSG_OOB的组合; MSG_PEEK代表将资料拷贝到
使用者提供的 buffer,但是资料并不从系统的 input buffer 中移走;0 则表示
拷贝并移走。

所以将最后一个参数置为0即可。
------解决方案--------------------
我以前遇到过,结论给你:无法清空缓存里面的数据,这是系统维护的.如果缓存里面有3个,你只收了2个,那么2个Popup,1个留在里面.所以自己要计算好.
------解决方案--------------------
数据不会堆积啊 ,指针会自己下移,前面的数据会自动清除
------解决方案--------------------
数据不会堆积啊 ,指针会自己下移,前面的数据会自动清除

------------------------------------------------
你说的没错,但是如果你前一次没有取干净,那么就会留下垃圾数据,
一般缓存时8k,比如你有6k的垃圾数据,后面一次来了8k的数据,在缓存里面
其实只有2k的正常数据和6k的垃圾数据,那么你取一下8k的时候,怎么会不错哪?
所以要自己计算好,两边的数据格式是否一样
------解决方案--------------------
不会吧,太可怕啦,那数据不是越积越多,系统会越来越慢吗?
----------------------
系统不会变慢,但是你取到的数据是错误的,造成你的程序crash,failure
------解决方案--------------------
我们当时出现这个问题,是由于编码格式的不同照成的.如发送端,编码以unicode8来发,接受端以unicodedefault来收.

这样,你看,unicodedefault认为每个字符都是2位byte,而unicode8不同.所以在计算应该收多少时候会错.
解决方法,统一格式,都用unicodedefault
------解决方案--------------------
这是你的服务端接收代码有问题。前面我说了根据最小桢间间隔来接收。
------解决方案--------------------
服务器段的,怎么不直接用Socket 对象,自己手动控制数据流

TcpListener本身就是一个高级层次的包装。理解不好里面的机制,反倒很容易出错
------解决方案--------------------



才看到,你还没加循环判断,一次就能接受全部数据?那是理想情况

byte[] bytes = new byte[1024];

int bytesRev = 0
string msg = " ";
do
{
bytesRev = s.Receive(bytes, 0, bytes.Length, SocketFlags.None);
msg += System.Text.Encoding.UTF8.GetString(bytes, 0, bytesRev);
}
while(bytesRev > 0);
------解决方案--------------------
什么原因不太清楚,我的接收部分是这样写的
//接收线程函数
private void ReceiveDataArrived()
{
int LastBytesRead = 0;
while (true)