110,535
社区成员
发帖
与我相关
我的任务
分享
public class State
{
public NetworkStream ns;
public byte[] buffer;
}
readBuffer = new byte[1024];
networkStream.BeginRead(readBuffer, 0, readBuffer.Length, new AsyncCallback(readCallBack), networkStream);
State state = new State();
state.ns = networkStream;
state.buffer = new byte[1024];
networkStream.BeginRead(state.buffer, 0, readBuffer.Length, new AsyncCallback(readCallBack), state);
class SocketServer
{
/// <summary>
/// 监听端口号
/// </summary>
public int Port { get; set; }
/// <summary>
/// 监听IP地址
/// </summary>
public string IP { get; set; }
private TcpListener tcpListener;
//buffer大小为1k
private const int BufferSize = 1024;
private byte[] ReadBuffer;
/// <summary>
/// 开始监听
/// </summary>
protected void Open()
{
tcpListener = new TcpListener(IPAddress.Parse(IP), Port);
try
{
tcpListener.Start();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(OnAccept), null);
}
catch (SocketException ex)
{
//logger.WarnFormat("服务器监听发生异常:{0}\nSocket ErrorCode: {1}\n提示:请检查端口是否已被占用", ex.Message, ex.ErrorCode);
throw ex;
}
catch (Exception ex)
{
//logger.Warn(ex);
throw ex;
}
}
/// <summary>
/// 获取监听到的客户端
/// </summary>
/// <param name="ar"> </param>
private void OnAccept(IAsyncResult ar)
{
TcpListener clientListener = (TcpListener)ar.AsyncState;
//接受客户的连接,得到连接的Socket
TcpClient client = clientListener.EndAcceptTcpClient(ar);
NetworkStream networkStream = client.GetStream();
//异步读取数据
if (networkStream.CanRead)
{
ReadBuffer = new byte[BufferSize];
networkStream.BeginRead(ReadBuffer, 0, ReadBuffer.Length, new AsyncCallback(readCallBack), networkStream);//开始异步读取数据
}
//继续监听
clientListener.BeginAcceptTcpClient(new AsyncCallback(OnAccept), null);
}
/// <summary>
/// TCP读数据的回调函数
/// </summary>
/// <param name="ar"> </param>
private void readCallBack(IAsyncResult ar)
{
NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
int numberOfBytesRead;
numberOfBytesRead = myNetworkStream.EndRead(ar);
if (numberOfBytesRead > 0)
{
byte[] dd = new byte[numberOfBytesRead];
Array.Copy(ReadBuffer, 0, dd, 0, numberOfBytesRead);
//信息写入数据库
//DAL.Insert()....
}
else
{
//被动断开时
myNetworkStream.Close();
myNetworkStream.Dispose();
}
}
}
//这样不行?