socket传输图片~

lied 2015-08-17 02:10:58
想利用socket在client端发送一个jpe格式的图片,在serve端显示。 代码如下: (好像无法进入到Server的read事件中)
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<jpeg.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMemoryStream *Stream=new TMemoryStream();
TJPEGImage *myJPEG=new TJPEGImage();
if(OpenPictureDialog1->Execute())
myJPEG->LoadFromFile(OpenPictureDialog1->FileName);
myJPEG->SaveToStream(Stream);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int len;
byte Buf[10000];
TMemoryStream *tmpStream=new TMemoryStream();
TJPEGImage *tjpeg=new TJPEGImage();
len=Socket->ReceiveLength(); //读出包长度
Socket->ReceiveBuf(Buf,len); //接收数据包并读入缓冲区内
tmpStream->Write(Buf,len); //追加入流M中
tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像
Image1->Canvas->Draw(0,0,tjpeg);
}
//---------------------------------------------------------------------------
...全文
1287 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lied 2015-08-25
  • 打赏
  • 举报
回复
引用 15 楼 DelphiGuy 的回复:
jpeg error #52这是load jpeg数据的时候出错,估计是你加载数据没有从文件头部开始。你如果每次接收都new一个TJPEGImage那显然是不行的。
搞定了。 TMemoryStream *tmpStream;定义为全局变量解决了。 谢谢你的耐心解答~
  • 打赏
  • 举报
回复
jpeg error #52这是load jpeg数据的时候出错,估计是你加载数据没有从文件头部开始。你如果每次接收都new一个TJPEGImage那显然是不行的。
lied 2015-08-24
  • 打赏
  • 举报
回复
引用 13 楼 DelphiGuy 的回复:
也就是说你要在TForm1::ServerSocket1ClientRead事件处理中判断文件全部接收完毕,再:
tmpStream->Position = 0;
tjpeg->LoadFromStream(tmpStream);
您好,我判断了len小于8192,然后load
程序调试结果如下,还是有错误。。
lied 2015-08-20
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
myJPEG->SaveToStream(Stream); Stream->Position = 0; ClientSocket1->Socket->SendStream(Stream); tmpStream->Write(Buf,len); //追加入流M中 tmpStream->Position = 0; tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像
发送成功了,接收的时候不知道如何处理,问题应该在于接收的时候只写入了8192字节的内容在 图片中,只显示一点点图。 这个地方细节如何处理合适。
lied 2015-08-20
  • 打赏
  • 举报
回复
引用 5 楼 ksrsoft 的回复:
Position =0 你发送普通文本字符串是否成功
恩,普通字符可以。 文本文件也实现了。 就是图片无法实现,网上也找不到例子。自己摸索的写,感觉程序应该有问题。
lied 2015-08-20
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
myJPEG->SaveToStream(Stream); Stream->Position = 0; ClientSocket1->Socket->SendStream(Stream); tmpStream->Write(Buf,len); //追加入流M中 tmpStream->Position = 0; tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像
非常感谢,之前分步调试无法进入read事件中,现在终于可以了。 修改后还是出现问题,如图: 请问程序是不是还有问题,要对接受数据包大小进行判定么? Image1->Canvas->Draw(0,0,tjpeg); 这句是不是应该等tjpeg loadstream 完全结束后在执行? 麻烦您看一下,谢谢喽~
  • 打赏
  • 举报
回复
也就是说你要在TForm1::ServerSocket1ClientRead事件处理中判断文件全部接收完毕,再: tmpStream->Position = 0; tjpeg->LoadFromStream(tmpStream);
  • 打赏
  • 举报
回复
当然要在接收数据全部写到stream之后,再定位到stream的开头,再装载到jpeg。
lied 2015-08-20
  • 打赏
  • 举报
回复
引用 5 楼 ksrsoft 的回复:
Position =0 你发送普通文本字符串是否成功
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<jpeg.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TMemoryStream *Stream=new TMemoryStream();
 TJPEGImage *myJPEG=new TJPEGImage();
 if(OpenPictureDialog1->Execute())
 myJPEG->LoadFromFile(OpenPictureDialog1->FileName);
 myJPEG->SaveToStream(Stream);
 Stream->Position=0;
 ClientSocket1->Socket->SendStream(Stream);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
 int len,pos;
 char *Buf=new char[8192];
 TMemoryStream *tmpStream=new TMemoryStream();
 TJPEGImage *tjpeg=new TJPEGImage();
 len=Socket->ReceiveLength();//读出包长度
 Socket->ReceiveBuf(Buf,len);//接收数据包并读入缓冲区内
 tmpStream->Write(Buf,len);//追加入流M中
 tmpStream->Position=0;
 tjpeg->LoadFromStream(tmpStream);//将流M中的数据读至JPG图像
 tjpeg->SaveToFile("C://temp.jpeg");

}


//---------------------------------------------------------------------------
现在图片小于8K的可以实现,大于8K的只有部分图片,代码应如何处理? 刚接触,麻烦帮忙看一下,谢谢!
lied 2015-08-20
  • 打赏
  • 举报
回复
引用 9 楼 DelphiGuy 的回复:
不管你传输什么类型的文件(其实这无关紧要),你需要自己定义一个数据结构(协议),起码文件名、大小要有(还可能需要传输序号、检验值等等),因为文件可能比较大,一次接收不完,接收端也需要判断文件接收完整与否。
恩,是滴。我刚开始学BCB和soket,所以 我现在只是想实现一个简单图片传输,其他信息再完善。因为接收端默认缓冲区大小8192,我这个地方使用了几种办法都处理的不是很好,图片只能收到一部分。(小于8K的图片能完全接受) 不清楚 tmpStream->Write(Buf,len); //追加入流M中 tmpStream->Position = 0; tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像 Write追加是否是自动接在上一部分后面,LoadFromStream是否也可以一段一段load,还是说流全部接受后再进行loadfromstream程序这个地方处理应该有问题,不知道如何才能实现。可以就代码问题解决一下么? 谢谢!
  • 打赏
  • 举报
回复
不管你传输什么类型的文件(其实这无关紧要),你需要自己定义一个数据结构(协议),起码文件名、大小要有(还可能需要传输序号、检验值等等),因为文件可能比较大,一次接收不完,接收端也需要判断文件接收完整与否。
缘中人 2015-08-19
  • 打赏
  • 举报
回复
Position =0 你发送普通文本字符串是否成功
  • 打赏
  • 举报
回复
myJPEG->SaveToStream(Stream); Stream->Position = 0; ClientSocket1->Socket->SendStream(Stream); tmpStream->Write(Buf,len); //追加入流M中 tmpStream->Position = 0; tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像
lied 2015-08-19
  • 打赏
  • 举报
回复
[quote=引用 1 楼 DelphiGuy 的回复:] 就你的代码来看,你就没有发送图片。
#include <vcl.h>
 #pragma hdrstop
 #include<jpeg.hpp>

 #include "Unit1.h"
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 #pragma resource "*.dfm"
 TForm1 *Form1;
 //---------------------------------------------------------------------------
 __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
 {
 }
 //---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
 TMemoryStream *Stream=new TMemoryStream();
 TJPEGImage *myJPEG=new TJPEGImage();
 if(OpenPictureDialog1->Execute())
 myJPEG->LoadFromFile(OpenPictureDialog1->FileName);
 myJPEG->SaveToStream(Stream);
 ClientSocket1->Socket->SendStream(Stream);
 }
 //---------------------------------------------------------------------------

 void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
       TCustomWinSocket *Socket)
 {
 int len;
 byte Buf[10000];
 TMemoryStream *tmpStream=new TMemoryStream();
 TJPEGImage *tjpeg=new TJPEGImage();
 len=Socket->ReceiveLength(); //读出包长度
Socket->ReceiveBuf(Buf,len); //接收数据包并读入缓冲区内
tmpStream->Write(Buf,len); //追加入流M中
tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像
Image1->Canvas->Draw(0,0,tjpeg);
 }
额,是的,当时加入了SendStream 忘了复制在这里。。。这样依旧不可以,请问哪里还有问题。谢谢!
lied 2015-08-19
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
就你的代码来看,你就没有发送图片。
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include<jpeg.hpp> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TMemoryStream *Stream=new TMemoryStream(); TJPEGImage *myJPEG=new TJPEGImage(); if(OpenPictureDialog1->Execute()) myJPEG->LoadFromFile(OpenPictureDialog1->FileName); myJPEG->SaveToStream(Stream); ClientSocket1->Socket->SendStream(Stream); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { int len; byte Buf[10000]; TMemoryStream *tmpStream=new TMemoryStream(); TJPEGImage *tjpeg=new TJPEGImage(); len=Socket->ReceiveLength(); //读出包长度 Socket->ReceiveBuf(Buf,len); //接收数据包并读入缓冲区内 tmpStream->Write(Buf,len); //追加入流M中 tjpeg->LoadFromStream(tmpStream); //将流M中的数据读至JPG图像 Image1->Canvas->Draw(0,0,tjpeg); } //---------------------------------------------------------------------------
  • 打赏
  • 举报
回复
就你的代码来看,你就没有发送图片。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧