//服务端代码IPAddress ip = IPAddress.Parse("192.199.0.3");
tcpListener = new TcpListener(ip, 8000);tcpListener.Start();Byte[] buffer = new byte[2048];String data = null;

SetText setText = new SetText(setRichTextBoxText);while(true)
{

this.Invoke(setText, new object[]{"Waiting for a connection... "}); TcpClient client = tcpListener.AcceptTcpClient();  
          
this.Invoke(setText, new object[]{"Connected!"}); data = null;

NetworkStream stream = client.GetStream(); int i = stream.Read(buffer, 0, buffer.Length);

data = System.Text.Encoding.ASCII.GetString(buffer, 0, i);

data = data.ToUpper();

buffer = System.Text.Encoding.ASCII.GetBytes(data); stream.Write(buffer, 0, buffer.Length);

this.Invoke(setText, new object[]{data}); client.Close();
}//客户端代码private void button1_Click(object sender, System.EventArgs e)
{
    try
    {
        tcpClient = new TcpClient("192.9.200.3", 8000);
    
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(this.textBox1.Text);                 NetworkStream stream = tcpClient.GetStream();        stream.Write(data, 0, data.Length);        String responseData = String.Empty;        Int32 bytes = stream.Read(data, 0, data.Length);
        responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);        this.richTextBox1.Text += "Received: " + responseData + "\n";
  
        stream.Close();                 this.textBox1.Text = "";    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    finally
    {   
tcpClient.Close();
    }
}如上面的代码所示,只是客户端将textbox中的内容发到服务端,服务端再返一个信息给客户端之后他们就断开连接了,如果我想他们的连接一直不断,那么应该怎么改写上面的代码呢?

解决方案 »

  1.   

    刚才因为公司锁门了,要赶着走人,现在详细的说一下上面的代码,是服务端启动以后对8000端口进行监听(服务端窗口上有一个RICHTEXTBOX),客户端(窗口上有一个TEXTBOX,一个RICHTEXTBOX和一个BUTTON)在TEXTBOX里面输入内容之后点击按钮就开始与服务端连接并把TEXTBOX内容发送到服务端,服务端接受到请求之后,把发送过来的数据_DATA显示在RICHTEXTBOX上,然后在_DAT前面加上几个字符(这一步上面的代码漏写了)再发送回客户端,然后就执行client.Close(),客户端在接受到回传的数据之后也把它显示在RICHTEXTBOX上面,然后执行tcpClient.Close()断开连接,如果不加上tcpClient.Close()的话,程序好象会出问题因为本人是SOCKET的初学者,对这方面没什么竟然,请教一下各位,如果才能保证SERVER和CLIENT之间的连接不断开,进行连续的通讯呢?也就是说把TEXTBOX的内容发送到SERVER之后,连接不断开,等待下一次发送数据.如果这样做,上面的代码应该如何修改呢?先谢过各位老大了!
      

  2.   

    tcp如果不是物理原因,你不显式断掉连接,它是不会自动关闭连接.另外,发送与接收数据,最后使用异步.其使用方法可参考SDK.对于大数据包要拆分,分块传输,到另一端再按顺序组合.
      

  3.   

    呵呵因为我只接触SOCKET才两三天,所以先从简单的入手
      

  4.   

    想问一下,如果我用的是TcpListener和TcpClient,如果在TcpClient客户端获得从服务端发过来的数据的长度呢?
      

  5.   

    看MSDN,上面好象说TcpListener和TcpClient只能实现同步通讯(不知是否我理解错了),可以用TcpListener和TcpClient做异步通讯吗?
      

  6.   

    因为你打开连接处理后又关闭了,所以没有保持连接.
    NetworkStream是支持同步和异步的流处理的,Read方法可以获取数据接收的长度.
    消息的发送和接收最好是用异步来处理,通过委托建立数据发送和接收的钩子来进行监控.
      

  7.   

    henryfan1(http://henryfan.cnblogs.com) ( ) 信誉:69  2006-07-19 10:05:00  得分: 0  
     
       因为你打开连接处理后又关闭了,所以没有保持连接.
    NetworkStream是支持同步和异步的流处理的,Read方法可以获取数据接收的长度.
    消息的发送和接收最好是用异步来处理,通过委托建立数据发送和接收的钩子来进行监控.
    "消息的发送和接收最好是用异步来处理,通过委托建立数据发送和接收的钩子来进行监控."TcpListener和TcpClient好象不可以这样处理吧?Socket类才可以,不知道我有没有理解错呢...如果TcpListener和TcpClient的功能这么弱,为何还有存在的必要呢?一般TcpListener和TcpClient的应用场合包括哪些呀?
      

  8.   

    “NetworkStream是支持同步和异步的流处理的,Read方法可以获取数据接收的长度.”不明白,NetWorkStream.Read只是从流里面读数据,怎么可以获得接收收据的长度呢?望赐教!
      

  9.   

    如果TcpListener和TcpClient的功能这么弱,为何还有存在的必要呢?
    你没有理解这两个对象,看一下MSDN这两个对象是用于简化基于Tcp的服务和连接的应用.
    对于数据的发送和接收是依赖于NetworkStream的(该对象是基于Socket的包装,供了异步处理的方法),对于异步操作你必须手动创建异步调用结束的代码(就是异常调用成功的过程),在这个过程你可以切入委托代码进行监控.
      

  10.   

    这些协议类使用 Socket 类的同步方法提供对网络服务的简单直接的访问,没有维护状态信息的系统开销,也不需要了解协议特定套接字的设置细节。若要使用异步 Socket 方法,可以使用 NetworkStream 类提供的异步方法。若要访问不是由协议类公开的 Socket 类的功能,必须使用 Socket 类。>>>>>上面是不是说明,如果使用TcpListener和TcpClient要实现异步通讯的话,只能使用NetworkStream的异步方法?
      

  11.   

    备注
    TcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。>>>>>这句话让人理解为TcpClient类的功能简单,用于同步阻塞模式进行网络通讯