2010-04-17 34 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); 
} 

我希望這個僞代碼是明確的,隨便問問題:)