发送时可以设置每3秒最最只发30条消息
int bufferSize = 64000
private NetworkStream _stream;private byte[] _receiveBuffer = new byte[bufferSize]; // 准备接收的数据缓冲
private byte[] _sendBuffer = new byte[bufferSize]; // 准备发送的数据缓冲
private byte[] _receiveTokenBuffer = new byte[bufferSize];
// 连接服务器
public override bool connect ()
{
if (_connectThread == null && _state != CONNECTION_STATE.CONNECTED)
{
_connectThread = ThreadManager.GetInstance().StartThread(new ThreadStart(connectThread));
return true;
}
return false;
}
private void connectThread()
{
try
{
LogManager.GetInstance().info ("Connecting...{0} : {1} ",ip,port);
_state = CONNECTION_STATE.CONNECTING;
_client = new TcpClient(ip,port);
if (!_client.Connected)
throw new Exception("连接失败");
_state = CONNECTION_STATE.CONNECTED;
_stream = _client.GetStream ();
_first = true;
AsyncCallback callBack = new AsyncCallback (ReadComplete);
lock (_stream) {
_stream.BeginRead (_receiveBuffer, 0, bufferSize, callBack, null);
}
onConnect ();
}
catch (Exception ex)
{
_client = null;
_state = CONNECTION_STATE.CONNECTFAIL;
}
_connectThread = null;
}
// 发送消息(线程)
private void sendMessages ()
{
...
if (_client == null)
{
reconnect();
return;
}
if (_client.connected == null)
{
reconnect();
return;
}
...
lock (_stream) { _stream.Write (_sendBuffer, 0, size); }//发送
...
}
private void ReadComplete (IAsyncResult ar)
{
if (_client == null)
{
reconnect();
return;
}
if (_client.connected == null)
{
reconnect();
return;
}
try
{
int bytesRead = 0;
lock (_stream) { bytesRead = _stream.EndRead (ar); }
// 本次读取的字节数
if (bytesRead == 0) throw new Exception ("Connect-----Reading data, 0 byte");
int index = 0;
// 先处理上次收包残留的数据
if (_receiveTokenSize > 0)
{
// 至少是一个short,才能完整读出协议的长度
if (_receiveTokenSize >= 2)
{
ushort size = getMessageSize(_receiveTokenBuffer,0);//System.BitConverter.ToUInt16 (_receiveTokenBuffer, 0);
// 还不是一个完整的包
if (bytesRead + _receiveTokenSize < size)
{
index = bytesRead;
Array.Copy (_receiveBuffer, 0, _receiveTokenBuffer, _receiveTokenSize, index);
_receiveTokenSize += bytesRead;
}
else
{
ushort ptcl = getMessagePtcl(_receiveTokenBuffer,0); //System.BitConverter.ToUInt16 (_receiveTokenBuffer, 2);
// 读取完整的协议包
index = size - _receiveTokenSize;
Array.Copy (_receiveBuffer, 0, _receiveTokenBuffer, _receiveTokenSize, index);
_receiveTokenSize = 0;
readMessage (ptcl, _receiveTokenBuffer,getMessageOffset(),size - getMessageOffset());
}
}
else
{
index = bytesRead;
Array.Copy (_receiveBuffer, 0, _receiveTokenBuffer, _receiveTokenSize, index);
_receiveTokenSize += bytesRead;
}
}
// 还有数据可以处理
while (index < bytesRead)
{
if (bytesRead - index >= 2)
{
ushort size = getMessageSize(_receiveBuffer,index);// System.BitConverter.ToUInt16 (_receiveBuffer, index);
// 协议不完整
if (index + size > bytesRead)
{
_receiveTokenSize = bytesRead - index;
Array.Copy (_receiveBuffer, index, _receiveTokenBuffer, 0, _receiveTokenSize);
break;
}
ushort ptcl = getMessagePtcl(_receiveBuffer,index); // System.BitConverter.ToUInt16 (_receiveBuffer, index + 2);
readMessage (ptcl, _receiveBuffer, index + getMessageOffset(), size - getMessageOffset());
index += size;
}
else
{
_receiveTokenSize = bytesRead - index;
Array.Copy (_receiveBuffer, index, _receiveTokenBuffer, 0, _receiveTokenSize);
break;
}
}
// 清空缓存,避免脏读
Array.Clear (_receiveBuffer, 0, _receiveBuffer.Length);
// 再次调用BeginRead(),完成时调用自身,形成无限循环
AsyncCallback callBack = new AsyncCallback (ReadComplete);
lock (_stream) { _stream.BeginRead (_receiveBuffer, 0, bufferSize, callBack, null); }
}
catch (Exception ex)
{
recvMessageError();
LogManager.GetInstance().error("接收消息失败 {0}:{1} {2}",ip,port,ex.ToString());
}
}