发送JPEG文件...有时是不完整
问题描述:
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
答
你得到你的形象的方法是十分错误的,这样做是这样的:
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);
}
我希望这个伪代码是明确的,随便问问题:)