日期:2014-05-18  浏览次数:20956 次

关于socket服务用异步方式的问题。
下面的代码是从网找到的,能正常运行没有问题,我有一些问题:
1、TcpListener server 这些变量都是局部的,为什么还能正常工作。
2、我如何停止监听服务。

private void AcceptCallback(IAsyncResult ar) 
  { 
  TcpListener server = (TcpListener)ar.AsyncState; 
  ClientState state = new ClientState(); 

  // Once the accept operation completes, this callback will 
  // be called. In it, you can create a new TcpClient in much 
  // the same way you did it in the synchronous code you had: 

  state.client = server.EndAcceptTcpClient(ar); 

  // We're going to start reading from the client's stream, and 
  // we need a buffer for that: 

  state.buffer = new byte[4096]; 

  // Note that the TcpClient and the byte[] are both put into 
  // this "ClientState" object. We're going to need an easy 
  // way to get at those values in the callback for the read 
  // operation. 

  // Next, start a new accept operation so that we can process 
  // another client connection: 

  server.BeginAcceptTcpClient(AcceptCallback, server); 

  // Finally, start a read operation on the client we just 
  // accepted. Note that you could do this before starting the 
  // accept operation; the order isn't really important. 

  state.client.GetStream().BeginRead(state.buffer, 0,state.buffer.Length, ReadCallback, state); 
  } 

  private void ReadCallback(IAsyncResult ar) 
  { 
  ClientState state = (ClientState)ar.AsyncState; 
  int cbRead = state.client.GetStream().EndRead(ar); 

  if (cbRead == 0) 
  { 
  // The client has closed the connection 
  return; 
  }
  // Your data is in state.buffer, and there are cbRead 
  // bytes to process in the buffer. This number may be 
  // anywhere from 1 up to the length of the buffer. 
  // The i/o completes when there is _any_ data to be read, 
  // not necessarily when the buffer is full. 

  // So, for example: 下面的是我的实现。
  SockMsgStruct message = new SockMsgStruct();
  message = (SockMsgStruct)ZhiKe.Serialization.ByteToObj(state.buffer);

  StreamWriter f = new StreamWriter("c:/aa.txt",true);
  f.WriteLine(message.MsgUid);
  f.WriteLine(message.sMsg);
  f.WriteLine(message.iMsgType);
  f.Flush();
  f.Close();
  //textBox1.Text = textBox1.Text + strData + "/n/r";

  // For ASCII you won't have to worry about partial characters 
  // but for pretty much any other common encoding you'll have to 
  // deal with that possibility, as there's no guarantee that an 
  // entire character will be transmitted in one piece. 

  // Of course, even with ASCII, you need to watch your string 
  // terminations. You'll have to either check the re