gpt4 book ai didi

.net - 通过TCP套接字发送JPEG ...有时不完整

转载 作者:行者123 更新时间:2023-12-03 12:06:53 25 4
gpt4 key购买 nike

Vb.net

你好

我已经在一个项目上工作了几个月(vb 2008 express)。最后一个问题
我无法解决。

我需要将图像从“服务器”(监听器)发送到客户端。以下代码在大多数情况下都有效,但是有时图像不完整。我相信这可能与tcp数据包大小的变化有关,可能受网络上繁忙程度的限制。一世
我已经看到了将图像拆分为多个块并将其发送出去的代码示例,但由于我使用的是不同的vb版本,所以我无法使它们正常工作。要发送的图片最大不超过20k。

任何有效的代码示例都将是很棒的。数周来,我一直在尝试并没有克服最后的障碍。

谢谢您的期待。

客户 - - -

Sub GetPic()


'------- Connect to Server
ClientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _ ProtocolType.Tcp)
ClientSocket.Connect(Epoint)

'------- Send Picture Request
Dim Bytes() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes("Send Picture")
ClientSocket.Send(Bytes, Bytes.Length, SocketFlags.None)

'------- Receive Response
Dim RecvBuffer(20000) As Byte
Dim Numbytes As Integer

Numbytes = ClientSocket.Receive(RecvBuffer)

Dim Darray(Numbytes) As Byte
Buffer.BlockCopy(RecvBuffer, 0, Darray, 0, Numbytes)

'------- Close Connection
ClientSocket.Shutdown(SocketShutdown.Both)
ClientSocket.Close()

'-------
Dim MStrm = New MemoryStream(Darray)
Picture = Image.FromStream(MStrm)


End Sub

听众-----
'Threaded from a listener


Sub ClientThread(ByVal Client As TcpClient)

Dim MStrm As New MemoryStream
Dim Rbuffer(1024) As Byte
Dim Tbyte As Byte()
Dim NStrm As NetworkStream = Client.GetStream()

Dim I As Integer = NStrm.Read(Rbuffer, 0, Rbuffer.Length)
Dim Incoming As String = System.Text.Encoding.ASCII.GetString(Rbuffer, 0, I)

If Incoming = "Send Picture" then
Picture Save(MStrm, Picture.RawFormat)
Tbyte = MStrm.ToArray
NStrm.Write(Tbyte, 0, Tbyte.Length)
End if

Client.Close()

End Sub

最佳答案

这样获取图像的方式是完全错误的:

Numbytes = ClientSocket.Receive(RecvBuffer)

您很有可能会获得部分数据,因为套接字实际上在缓冲区中的容量可能小于完整镜像的数量。无论如何,尝试像这样接收它(我将在C#中给出示例):
MemoryStream responseStream = new MemoryStream();
byte[] recvBuffer = new recvBuffer[4096]; // just some size
int read = 0; // indicates how much data actually read from socket, can be smaller then buffer
do{
read = ClientSocket.Receive( recvBuffer ); // recieve data
responseStream.write( recvBuffer, 0, read ); // write it to resposne stream for later use
}
while( read != 0 );

这应该可以工作,但是在您的情况下,我会采取其他方法。这是客户的代码:
Socket s = new Socket( blablabla );
s.Connect( endPoint );
NetworkStream clientStream = new NetworkStream(s);
clientStream.Write( "Send picture" ); // send a command to server

int pictureSize = clientStream.ReadInt(); // here we expect to read following picture's size
byte[] pictureBuffer = clientStream.ReadBytes( pictureSize );

和服务器,监听器部分:
Socket serverSocket = new Socket( blablabla );
serverSocket.Bind( blabla );
serverSocket.Listen( 100 );

while( true ){
Socket clientSocket = serverSocket.Accept();
Thread t = new Thread( new ParametrizedThreadStart( (object Obj) =>
{
Socket clientSocket = (Socket)Obj;
NetworkStream clientStream = new NetworkStream( clientSocket );
string command = clientStream.ReadString();
if( command == "Send picture" ){
// get ur picture here
// get it's size
clientStream.Write( pictureSize );
clientStream.Write( pictureBytes );
}
} ) );
t.start( clientSocket );
}

我希望这段伪代码很清楚,可以随时提出问题:)

关于.net - 通过TCP套接字发送JPEG ...有时不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com