兄弟我也做过几个Socket方面的东东,有不少体会,最好的方法是用Socket的异步功能.比如:public void SetupRecieveCallback( Socket sock ) { try { AsyncCallback recieveData = new AsyncCallback( OnRecievedData ); sock.BeginReceive( m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock ); } catch( Exception ex ) { MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" ); } }public void OnRecievedData( IAsyncResult ar ) { // Socket was the passed in object Socket sock = (Socket)ar.AsyncState; // Check if we got any data try { int nBytesRec = sock.EndReceive( ar ); if( nBytesRec > 0 ) { // Wrote the data to the List string sRecieved = Encoding.ASCII.GetString( m_byBuff, 0, nBytesRec ); // WARNING : The following line is NOT thread safe. Invoke is // m_lbRecievedData.Items.Add( sRecieved ); Invoke( m_AddMessage, new string [] { sRecieved } ); // If the connection is still usable restablish the callback SetupRecieveCallback( sock ); } else { // If no data was recieved then the connection is probably dead Console.WriteLine( "Client {0}, disconnected", sock.RemoteEndPoint ); sock.Shutdown( SocketShutdown.Both ); sock.Close(); } } catch( Exception ex ) { MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" ); } }给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.
to RedGoldFish(红金鱼):给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.强烈感谢哈!!!!!!要的就是这个!!!!!谢谢!!!!
{
rds = Client.Receive(InBuffer2);
}
这个写法对吗?
do
{
int n = socket.Receive(buff, 0 , buff.Length, SocketFlags.None);
bytesReceived += n;
}
while(bytesReceived < 70000);
或者异步BeginReceive
专注于自动提交,如发贴机资源采集器等网络营销软件的开发及相关领域如验证码识别技术。
QQ群号:24733057
{
int bytesToRead = 70000 - bytesReceived;
int n = socket.Receive(buff, 0 , Math.Min(bytesToRead, buff.Length), SocketFlags.None);
bytesReceived += n;
}
while(bytesReceived < 70000);
{
rds = Client.Receive(InBuffer2);
}
我估计是你没利用好那段代码,我添个变量string msg = "";
byte[] buff = new byte[1500];int bytesReceived = 0;do
{
int bytesToRead = 70000 - bytesReceived;
int n = socket.Receive(buff, 0 , Math.Min(bytesToRead, buff.Length), SocketFlags.None); //在这里把当次接受的数据+起来。 我用的是ASCII,根据你的具体情况更改编码 msn += System.Text.Encoding.ASCII.GetString(buff, 0, n); bytesReceived += n;
}
while(bytesReceived < 70000);Console.WriteLine(msg);
{
try
{
AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
sock.BeginReceive( m_byBuff, 0, m_byBuff.Length,
SocketFlags.None, recieveData, sock );
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" );
}
}public void OnRecievedData( IAsyncResult ar )
{
// Socket was the passed in object
Socket sock = (Socket)ar.AsyncState; // Check if we got any data
try
{
int nBytesRec = sock.EndReceive( ar );
if( nBytesRec > 0 )
{
// Wrote the data to the List
string sRecieved = Encoding.ASCII.GetString( m_byBuff,
0, nBytesRec ); // WARNING : The following line is NOT thread safe. Invoke is
// m_lbRecievedData.Items.Add( sRecieved );
Invoke( m_AddMessage, new string [] { sRecieved } ); // If the connection is still usable restablish the callback
SetupRecieveCallback( sock );
}
else
{
// If no data was recieved then the connection is probably dead
Console.WriteLine( "Client {0}, disconnected",
sock.RemoteEndPoint );
sock.Shutdown( SocketShutdown.Both );
sock.Close();
}
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" );
}
}给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.
- <RESPONSE>
<PAGESIZE>001233</PAGESIZE> 这是发过来xml文件的头部这个就是包的大小,如何截去呢?
- <HEADER>
<COMMAND>QUERY</COMMAND>
<QUERYID>32163975</QUERYID>
</HEADER>
- <BODY>。。
- <RESPONSE>
<PAGESIZE>001233</PAGESIZE> 这段然后取得pagesize 再往下收
- <RESPONSE>
<PAGESIZE>001233</PAGESIZE>上边这些不能算是包头, 它们已经是XML 里边的内容了,我说的包头是指在XML只外的.从Socket接受来的原始数据都是Byte,通常的包头都是用Byte的最前几位.比如: 00 是特征字,代表一个包开始,然后两位 XX 代表整个包的Byte数目, 然后就是正式的XML文件.接收的时候先查头两个 Byte, 如果是 00 就是一个包的开始,然后查包的大小......
详见:http://www.psec.net.cn