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

TcpListener类的应用:只能接收一次内容!
在本机的2000端口监听客户端连接,然后在页面上显示传送的文件内容;
问题如下:第一次传送是可以显示的;但是不能连续显示第二次传入的内容?
请教高手指点一下,谢谢!


代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace TcpReceiver
{
  public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();
  Thread thread = new Thread(new ThreadStart(Listen));
  thread.Start();
  }

  protected void Listen()
  {
  try
  {
  // IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
  IPAddress ipAddress = IPAddress.Any;
  Int32 port = 2000;
  TcpListener tcpListener = new TcpListener(ipAddress, port);
  tcpListener.Start();

  //TcpClient tcpClient = tcpListener.AcceptTcpClient(); 这里是同步调用会阻塞后面的请求
  tcpListener.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), tcpListener);

  //这里采用异步调用,接收一个连接请求,就开启一个线程来处理请求
  }
  catch (Exception ex)
  {
  MessageBox.Show("出错了: \n" + ex.Message, "错误");
  }
   
  }

  protected void AcceptClient(IAsyncResult ar)
  {
  try
  {
  TcpListener tcpListener = (TcpListener)ar.AsyncState;
  TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar);
  NetworkStream networkStream = tcpClient.GetStream();
  StreamReader streamReader = new StreamReader(networkStream);
  string content = streamReader.ReadToEnd();

  rtbxContent.Invoke(new MethodInvoker(delegate
  {
  rtbxContent.Text = "";
  rtbxContent.Text = content;
  }));

  networkStream.Close();
  tcpClient.Close();
  //tcpListener.Stop();
  }
  catch (Exception ex) 
  {
  MessageBox.Show("出错了: \n" + ex.Message, "错误");
  }
   
  }
  }
}


------解决方案--------------------
你先new一个Thread,在里面:
C# code

while()
{
   Socket socket = tcplistener.AcceptSocket();
   if (socket != null)
        StartItem(socket);

}

------解决方案--------------------
你这个Listen和AcceptClient的方法也就被执行了一次吧,里面也没有while循环取读取数据,读了一次,就结束线程了
------解决方案--------------------
TcpListener tcpListener = (TcpListener)ar.AsyncState;
TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar);
while (true)
{。。。。。
----求分