public sealed class DwSocketClient : IDisposable
{
private int bufferSize = 10000;
private Socket _serverSocket;
private IPEndPoint _hostEndPoint;
private AutoResetEvent _autoResetEvent;
private byte[] _byteCallBackMessage;
private SocketAsyncEventArgs _connectArgs;
private SocketAsyncEventArgs _sendEventArgs;
private SocketAsyncEventArgs _receiveEventArgs;
private string _ip;
private int _port;
public DwSocketClient(string ip,int port)
{
this._ip = ip;
this._port = port;
this._hostEndPoint = new IPEndPoint(IPAddress.Parse(_ip), _port);
_connectArgs = new SocketAsyncEventArgs();
_connectArgs.RemoteEndPoint = this._hostEndPoint;
_connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
this._receiveEventArgs = new SocketAsyncEventArgs();
this._receiveEventArgs.RemoteEndPoint = this._hostEndPoint;
this._receiveEventArgs.SetBuffer(new Byte[bufferSize], 0, bufferSize);
this._receiveEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);
this._sendEventArgs = new SocketAsyncEventArgs();
this._sendEventArgs.RemoteEndPoint = this._hostEndPoint;
this._sendEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSend);
}
public bool Connect()
{
try
{
this._autoResetEvent = new AutoResetEvent(false);
this._serverSocket = new Socket(this._hostEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.ConnectAsync(_connectArgs);
this._autoResetEvent.WaitOne(1000*1);
SocketError errorCode = _connectArgs.SocketError;
var connected = errorCode == SocketError.Success;
if (!connected)
{
return connected;
}
if (!_serverSocket.ReceiveAsync(this._receiveEventArgs))
{
ProcessReceive(this._receiveEventArgs);
}
return connected;
}
catch (Exception ex)
{
return false;
}
}
private void OnConnect(object sender, SocketAsyncEventArgs e)
{
this._autoResetEvent.Set();
}
private void OnReceive(object sender, SocketAsyncEventArgs e)
{
ProcessReceive(e);
}
private void ProcessReceive(SocketAsyncEventArgs e)
{
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
var allData = new byte[e.BytesTransferred];
Buffer.BlockCopy(e.Buffer, 0, allData, 0, e.BytesTransferred);
this._byteCallBackMessage = allData;
this._autoResetEvent.Set();
//接收后续的数据
if (!this._serverSocket.ReceiveAsync(e))
{
ProcessReceive(e);
}
}
else
{
// CloseClient();
}
}
public void CloseClient()
{
this._autoResetEvent.Close();
if (this._serverSocket.Connected)
{
//this._serverSocket.Close();
}
}
private void OnSend(object sender, SocketAsyncEventArgs e)
{
}
public byte[] Send(byte[] message)
{
try
{
this._byteCallBackMessage = null;
this._sendEventArgs.SetBuffer(message, 0, message.Length);
bool isSuccess = _serverSocket.SendAsync(this._sendEventArgs);
//Thread.Sleep(10*1000);
this._autoResetEvent.WaitOne(1000 * 5);
if (this._byteCallBackMessage == null)
{
}
return this._byteCallBackMessage;
}
catch (Exception ex)
{
return null;
}
}
#region IDisposable Members
public void Dispose()
{
this.CloseClient();
}
#endregion
}
if (!_serverSocket.ReceiveAsync(this._receiveEventArgs))
{
ProcessReceive(this._receiveEventArgs);
}
这里报异常:现在已经正在使用此 SocketAsyncEventArgs 实例进
public sealed class DwSocketClient : IDisposable
{
private int bufferSize = 10000;
private Socket _serverSocket;
private IPEndPoint _hostEndPoint;
private AutoResetEvent _autoResetEvent;
private byte[] _byteCallBackMessage;
private SocketAsyncEventArgs _connectArgs;
private SocketAsyncEventArgs _sendEventArgs;
private SocketAsyncEventArgs _receiveEventArgs;
private string _ip;
private int _port;
public DwSocketClient(string ip,int port)
{
this._ip = ip;
this._port = port;
this._hostEndPoint = new IPEndPoint(IPAddress.Parse(_ip), _port);
_connectArgs = new SocketAsyncEventArgs();
_connectArgs.RemoteEndPoint = this._hostEndPoint;
_connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
this._receiveEventArgs = new SocketAsyncEventArgs();
this._receiveEventArgs.RemoteEndPoint = this._hostEndPoint;
this._receiveEventArgs.SetBuffer(new Byte[bufferSize], 0, bufferSize);
this._receiveEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);
this._sendEventArgs = new SocketAsyncEventArgs();
this._sendEventArgs.RemoteEndPoint = this._hostEndPoint;
this._sendEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSend);
}
public bool Connect()
{
try
{
this._autoResetEvent = new AutoResetEvent(false);
this._serverSocket = new Socket(this._hostEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.ConnectAsync(_connectArgs);
this._autoResetEvent.WaitOne(1000*1);
SocketError errorCode = _connectArgs.SocketError;
var connected = errorCode == SocketError.Success;
if (!connected)
{
return connected;
}
if (!_serverSocket.ReceiveAsync(this._receiveEventArgs))
{
ProcessReceive(this._receiveEventArgs);
}
return connected;
}
catch (Exception ex)
{
return false;
}
}
private void OnConnect(object sender, SocketAsyncEventArgs e)
{
this._autoResetEvent.Set();
}
private void OnReceive(object sender, SocketAsyncEventArgs e)
{
ProcessReceive(e);
}
private void ProcessReceive(SocketAsyncEventArgs e)
{
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
var allData = new byte[e.BytesTransferred];
Buffer.BlockCopy(e.Buffer, 0, allData, 0, e.BytesTransferred);
this._byteCallBackMessage = allData;
this._autoResetEvent.Set();
//接收后续的数据
if (!this._serverSocket.ReceiveAsync(e))
{
ProcessReceive(e);
}
}
else
{
// CloseClient();
}
}
public void CloseClient()
{
this._autoResetEvent.Close();
if (this._serverSocket.Connected)
{
this._serverSocket.Close();
}
}
private void OnSend(object sender, SocketAsyncEventArgs e)
{
}
public byte[] Send(byte[] message)
{
try
{
this._byteCallBackMessage = null;
this._sendEventArgs.SetBuffer(message, 0, message.Length);
bool isSuccess = _serverSocket.SendAsync(this._sendEventArgs);
//Thread.Sleep(10*1000);
this._autoResetEvent.WaitOne(1000 * 5);
if (this._byteCallBackMessage == null)
{
}
return this._byteCallBackMessage;
}
catch (Exception ex)
{
return null;
}
}
#region IDisposable Members
public void Dispose()
{
this.CloseClient();
}
#endregion
}
public void CloseClient()
{
this._autoResetEvent.Close();
if (this._serverSocket.Connected)
{
this._serverSocket.Close();
}
}
重连时要把连接关闭掉,解决问题。