账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    用TCPclient做的管道不支持大数据发送和接收,怎么修改成哪个管道合适,vb.net做的redis接口
    30
    0

    用TCPclient做的管道不支持大数据发送和接收,怎么修改成哪个管道合适,vb.net做的redis接口
    如何修改支持管道大数据发送和接收

    相关代码

    Public Class RedisClient
        Private client As TcpClient
        Private stream As NetworkStream
        Private reply As RedisReply
        Private command As IRedisCommand
        Private memStream As MemoryStream

        Public ReadOnly Property Host As String

        Public ReadOnly Property Port As Integer

        Public ReadOnly Property [Return] As Object
            Get
                Return reply.Value
            End Get
        End Property

        Public Sub New(Optional host As String = "127.0.0.1", Optional port As Integer = 6379)
            If IsNothing(host) Then
                Throw New ArgumentNullException(NameOf(host))
            End If
            Me.Host = host
            Me.Port = port
            **client = New TcpClient()
            Try
                client.Connect(host, port)
                stream = client.GetStream()**
            Catch ex As Exception
                Throw New RedisException("An existing connection was forcibly closed by remote host.")
            End Try
        End Sub

        Public Sub Quit()
            command = New QuitCommand()
            Execute(command)
        End Sub

        Public Sub Append(key As String, value As String)
            command = New AppendCommand() With {.Key = key, .Value = value}
            Execute(command)
        End Sub

        Public Sub Del(ParamArray keys() As String)
            command = New DelCommand() With {.Keys = keys}
            Execute(command)
        End Sub

        Public Function Dump(key As String) As Byte()
            command = New DumpCommand() With {.Key = key}
            Execute(command)
            If IsNothing(reply.Value) Then
                Return Nothing
            Else
                Return Encoding.UTF8.GetBytes(reply.Value)
            End If
        End Function

        Public Sub Echo(message As String)
            command = New EchoCommand() With {.Message = message}
            Execute(command)
        End Sub

        Public Function Exists(key As String) As Boolean
            command = New ExistsCommand() With {.Key = key}
            Execute(command)
            Return reply.Value
        End Function

        Public Sub Expire(key As String, timeout As Integer)
            command = New ExpireCommand() With {.Key = key, .Timeout = timeout}
            Execute(command)
        End Sub

        Public Sub ExpireAt(key As String, ttl As DateTime)
            command = New ExpireAtCommand() With {.Key = key, .TTL = (ttl - #1/1/1970#).TotalSeconds}
            Execute(command)
        End Sub

        Public Function Get As String
            command = New GetCommand() With {.Key = key}
            Execute(command)
            Return reply.Value
        End Function

        Public Sub PExpire(key As String, timeout As Integer)
            command = New PExpireCommand() With {.Key = key, .Timeout = timeout}
            Execute(command)
        End Sub

        Public Sub PExpireAt(key As String, ttl As DateTime)
            command = New PExpireAtCommand() With {.Key = key, .TTL = (ttl - #1/1/1970#).TotalMilliseconds}
            Execute(command)
        End Sub

        Public Sub Ping()
            command = New PingCommand()
            Execute(command)
        End Sub

        Public Sub Auth(password As String)
            command = New AuthCommand() With {.Password = password}
            Execute(command)
        End Sub

        Public Sub Select
            command = New SelectCommand() With {.Index = index}
            Execute(command)
        End Sub

        Public Sub Set
            command = New SetCommand() With {.Key = key, .Value = value, .ExpireTime = expireTime, .Override = override}
            Execute(command)
        End Sub

        Public Function Time() As Date
            command = New TimeCommand()
            Execute(command)
            Return #1/1/1970#.AddSeconds(reply.Value(0)).ToLocalTime()
        End Function

        Private Sub Execute(command As IRedisCommand)
            **Dim bytes() As Byte = Encoding.UTF8.GetBytes(command.GetCommand() & vbCrLf)
            Try
                stream.Write(bytes, 0, bytes.Length)
                stream.Flush()
                ReDim bytes(client.ReceiveBufferSize)
                stream.Read(bytes, 0, bytes.Length)**
                Dim result = Encoding.UTF8.GetString(bytes)
                Select Case result(0)
                    Case "$"
                        Dim length = Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1))
                        If length = -1 Then
                            reply = New RedisReply(RESPType.BulkString, Nothing)
                        Else
                            reply = New RedisReply(RESPType.BulkString, result.Substring(result.IndexOf(vbCrLf) + 2, length))
                        End If
                    Case "+"
                        reply = New RedisReply(RESPType.SimpleString, result.Substring(1, result.IndexOf(vbCrLf) - 1))
                    Case ":"
                        reply = New RedisReply(RESPType.Integer, Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1)))
                    Case "-"
                        reply = New RedisReply(RESPType.Error, result.Substring(1, result.IndexOf(vbCrLf) - 1))
                        Throw New RedisException(reply.Value)
                    Case "*"
                        Dim count = Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1))
                        Dim items = result.Split(New Char() {vbCrLf, vbLf}, StringSplitOptions.RemoveEmptyEntries).ToList()
                        items.RemoveAt(0)
                        items.RemoveAll(Function(i) i.StartsWith("$"))
                        items.RemoveAt(items.Count - 1)
                        'reply = New RedisReply(RESPType.Array, items)
                End Select
            Catch ex As Exception
                Throw New RedisException($"There is an internal error during executing '{command.GetCommand()}'.")
            End Try
        End Sub
    End Class

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 大罗阎王 普通会员 1楼

      TCPClient作为TCP/IP协议栈上的客户端库,主要用于在客户端与服务器之间建立TCP连接。对于数据的发送和接收,TCPClient并没有直接支持大数据的发送和接收功能。

      如果需要在VB.NET中使用TCPClient实现Redis的接口,可以考虑使用Redis.Net框架,这个框架提供了许多Redis功能的实现。

      以下是一个简单的示例,展示如何使用Redis.Net和TCPClient在VB.NET中实现一个简单的Redis客户端:

      ```csharp using System; using System.Net; using System.Net.Sockets; using Redis.Net;

      namespace RedisClientExample { class Program { static void Main(string[] args) { // 创建一个TCPClient对象,用于连接Redis服务器 TcpClient tcpClient = new TcpClient("127.0.0.1", 6379);

              // 将TCPClient连接到Redis服务器
              using (Socket socket = tcpClient.GetStream())
              {
                  // 使用RedisNet连接Redis服务器
                  RedisConnection redisConnection = new RedisConnection(socket);
                  redisConnection.Connect();
      
                  // 执行一个命令
                  redisConnection.Execute("SET key value");
      
                  // 关闭Redis连接
                  redisConnection.Close();
              }
          }
      }
      
      class RedisConnection
      {
          private TcpClient socket;
      
          public RedisConnection(Socket socket)
          {
              this.socket = socket;
          }
      
          public void Connect()
          {
              // 连接到Redis服务器
              using (Socket stream = socket.GetStream())
              {
                  // 将Redis连接到Redis服务器
                  RedisCommandResult commandResult = redisConnection.Execute("ping");
                  if (commandResult.Status != Status.Success)
                  {
                      throw new Exception("Redis连接失败: " + commandResult.Status);
                  }
              }
          }
      }
      
      class RedisCommandResult
      {
          public Status Status { get; set; }
      
          public object Value { get; set; }
      }
      
      class Status
      {
          public Status(string status)
          {
              this.Status = status;
          }
      
          public string Status { get; set; }
      }
      

      } ```

      这个示例中,我们首先创建了一个TCPClient对象,然后使用这个对象连接到Redis服务器。然后,我们执行了一个命令(在这里是“ping”命令),并检查了命令的返回值。如果命令失败,我们将抛出一个异常。最后,我们关闭了Redis连接。

    更多回答
    扫一扫访问手机版