首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

SOCKET清除端口数据有关问题

2012-01-11 
SOCKET清除端口数据问题我用socket往服务器某个端口发送数据,服务器段接受数据后,将端口数据清空,怎么办呢

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)


{
//默认50ms为每帧的最小帧间间隔
for (int i = 0; i < 50; i++)
{
Thread.Sleep(1);
Application.DoEvents();
}

if (client.Available > LastBytesRead)
{
LastBytesRead = client.Available;
}
else
{
//已经接收到完整一帧,进行读取处理
if (LastBytesRead > 0)
{
byte[] Frame = new byte[LastBytesRead];
stream.Read(Frame, 0, LastBytesRead);
LastBytesRead = 0;
//处理该帧
...
}
}
}
}
[解决办法]
你说的没错,但是如果你前一次没有取干净,那么就会留下垃圾数据,
一般缓存时8k,比如你有6k的垃圾数据,后面一次来了8k的数据,在缓存里面
其实只有2k的正常数据和6k的垃圾数据,那么你取一下8k的时候,怎么会不错哪?
所以要自己计算好,两边的数据格式是否一样
---------------------------------------------
你可以一直读完,然后再检测数据.下面是我写的一个读取ftp服务器指令返回数据的方法
private string GetMessage()
{
string firstLine = reader.ReadLine();
if (firstLine == null || firstLine.Length == 0)
throw new IOException( "Unexpected null reply received ");

StringBuilder reply = new StringBuilder(firstLine);

string replyCode = reply.ToString().Substring(0, 3);

// check for multiline response and build up
// the reply
if (reply[3] == '- ')
{
bool complete = false;
while (!complete)
{
string line = reader.ReadLine();
if (line == null)
throw new IOException( "Unexpected null reply received ");

if (line.Length > 3 && line.Substring(0, 3).Equals(replyCode) && line[3] == ' ')
{
reply.Append(line.Substring(3));
complete = true;
}
else
{
// not the last line
reply.Append( "\r\n ");
reply.Append(line);
}
} // end while
}
// end if
return reply.ToString();
}

热点排行