2010-04-17 41 views
1

Vb.net发送JPEG文件...有时是不完整

我一直在一个项目工作了几个月,现在(2008年VB快递)。有一个最后的问题 ,我不能解决。

我需要从'服务器'(侦听器)发送图像到客户端。下面的代码大部分时间工作,但有时图像不完整。我相信这可能与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 

回答

1

你得到你的形象的方法是十分错误的,这样做是这样的:

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); 
} 

我希望这个伪代码是明确的,随便问问题:)