我想在客户端接收来自服务器端的图片,用TcpClient连接服务器端
TcpClient client = new TcpClient(hostName, portNum);
NetworkStream ns = client.GetStream();
可在客户端怎么知道服务器端发没发送数据?如果服务器端没发送数据
读取ns时将报错,最好就是想服务器端一样一直侦听,直到有数据传
过来再接收,请问各位大虾有什么建议?

解决方案 »

  1.   

    客户端先发送一个请求,服务器侦听到请求后回发数据,客户端接收.
     客户端发送请求-->等待服务器回发数据,-->这时程序停止继续运行并一直等待回发数据,一旦接收到回发数据,它将不在等待.不管服务器是否全部发完.所以有时会出现异步情况,导致内存泄露. TCPCLIENT有个致命弱点,它不能发送数据量大的东西,只能发些文字聊聊天还可以,如果传文件之类建议还是用底层的SOCKET.
      

  2.   

    请问客户端怎么监听?
    我是想做一个像qq似的两方会话模式
    不需要客户端的ip
      

  3.   

    Dim Client as New TcpClient(ServerAddress,ServerPort)
    Dim Ns As NetStream=Client.GetStream()
    Dim ErrMsg As String
    Dim ErrCodeHT As HashTable
    Dim RightCodeHt As HashTable
    Function RevResponse() As boolean
    Dim text As String
    Dim buffer As byte()=New Byte(1024-1){}
    Dim Num As integer
    Try
    Num=Ns.read(buffer,0,buffer.Length)
    Catch E as Exception
    ErrMsg="网络连接错误,请重试!"
    Return False
    End Try
    if Num<>0 Then
    Text=Encode.Default.GetString(Buffer).SubString(0,Num)
    End If
    Return Text
    End Function
    Private Sub SMTPCodeAdd()
                Me.ErrCodeHT.Add("500", "邮箱地址错误")
                Me.ErrCodeHT.Add("501", " 参数格式错误")
                Me.ErrCodeHT.Add("502", "命令不可实现")
                Me.ErrCodeHT.Add("503", "服务器需要SMTP验证")
                Me.ErrCodeHT.Add("504", "命令参数不可实现")
                Me.ErrCodeHT.Add("421", "服务未就绪,关闭传输信道")
                Me.ErrCodeHT.Add("450", "要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)")
                Me.ErrCodeHT.Add("550", "要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)")
                Me.ErrCodeHT.Add("451", "放弃要求的操作;处理过程中出错")
                Me.ErrCodeHT.Add("551", " 用户非本地,请尝试<forward-path>")
                Me.ErrCodeHT.Add("452", "系统存储不足,要求的操作未执行")
                Me.ErrCodeHT.Add("552", "过量的存储分配,要求的操作未执行")
                Me.ErrCodeHT.Add("553", "邮箱名不可用,要求的操作未执行(例如邮箱格式错误)")
                Me.ErrCodeHT.Add("432", "需要一个密码转换")
                Me.ErrCodeHT.Add("534", "认证机制过于简单")
                Me.ErrCodeHT.Add("538", " 当前请求的认证机制需要加密")
                Me.ErrCodeHT.Add("454", "临时认证失败")
                Me.ErrCodeHT.Add("530", "需要认证")
                Me.RightCodeHT.Add("220", "服务就绪")
                Me.RightCodeHT.Add("250", "要求的邮件操作完成")
                Me.RightCodeHT.Add("251", "用户非本地,将转发向<forward-path>")
                Me.RightCodeHT.Add("354", "开始邮件输入,以<CRLF>.<CRLF>结束")
                Me.RightCodeHT.Add("221", " 服务关闭传输信道")
                Me.RightCodeHT.Add("334", "服务器响应验证Base64字符串")
                Me.RightCodeHT.Add("235", "验证成功")
            End Sub
    Sub SendMsg()
    text=RevResponse()
    If (RightCodeHT.Item(Text.SubString(0,IIf(Text.Length>=3,3,Text.Length)) Is Nothing) 
     Exit Sub
    Then
    End If
    End Sub
      

  4.   

    更正下RevResponse函数:
    Function RevResponse() As String
    Dim text As String
    Dim buffer As byte()=New Byte(1024-1){}
    Dim Num As integer
    Try
    Num=Ns.read(buffer,0,buffer.Length)
    Catch E as Exception
    ErrMsg="网络连接错误,请重试!"
    Return "False"
    End Try
    if Num<>0 Then
    Text=Encode.Default.GetString(Buffer).SubString(0,Num)
    End If
    Return Text
    End Function
      

  5.   

    可以用
    while( true )
    {
        if( ns.DataAvailable() )
           //接收
        else
           Thread.Sleep(50);
    }