首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

求个范例.关于使用socket发送数据流

2013-02-20 
求个实例.关于使用socket发送数据流求一个实例..利用socket发送数据流.才接触的socket...求指点..因为需要

求个实例.关于使用socket发送数据流
求一个实例..利用socket发送数据流.

才接触的socket...求指点..

因为需要发送的是一个class..客户端接收此class后还原成对应的数据结构然后显示出来..

现在不知道怎么解决的就是.如何将这个class变成数据流...有想过通过保存成json文件.

SendStream如何将一个json或者一个class发送到客户端.并在客户端还原...服务端和客户端都有同样结构的class
[解决办法]
发送:数据流长度 + 数据流

可以规定 数据流长度 为一个 4char 的 int 型,不够的话,你用 8char 也行。
[解决办法]
跟把class保存到文件中是一个道理,你就当成把class写到一个文件中,然后把文件切成一块块发送出去,接收端收到文件后在把class从文件中读出来一样,具体做的时候不一定非得有这个文件,也没必要json格式,只要这边能完整发送、那边能顺利读出就行了
[解决办法]
我想通过网络向设备(led屏)iP:192.168.224.250 端口号:2929 
发送数据,比如发送unsigned char buf[1024]; 
中的数据, 
请问是用BCB中的 
        TClientSocket *ClientSocket1; 
        TServerSocket *ServerSocket1; 
        TUdpSocket *UdpSocket1; 
这三个用那个发送啊,如何发送? 

 

使用TClientSocket *ClientSocket1; 

属性设置:

1,Address:192.168.224.250 

2,Port:2929

//-----------------------------------------------

使用ClientSocket完成了工作,代码贴出来以备以后使用,呵呵

C/C++ code 

void __fastcall TMainFrm::FormCreate(TObject *Sender)
{
    TIniFile *ini;
ini=new TIniFile(".//SAS_Config.ini");
LedIp=ini->ReadString("infLED","LEDIP","192.168.224.250");
         ini->WriteString("infLED","LEDIP",LedIp);

         COMx=ini->ReadInteger("infLED","端口",2929);
         ini->WriteInteger("infLED","端口",COMx);
         LEDIpPort=COMx;
delete ini;
  try
  {
     
 ClientSocket1->Active=false;
            ClientSocket1->Address=LedIp;
            //ClientSocket1->Host=LedIp;
            ClientSocket1->Port=LEDIpPort;
            //ClientSocket1->Open();
            ClientSocket1->Active=true;
  }
  catch(...)
  {
      //
  }
}
void sendbuf(unsigned char * buf,int bufIndex)
{
     try
        {
            //ClientSocket1->Close();
            //ClientSocket1->Active=false;
            //ClientSocket1->Address=LedIp;
            //ClientSocket1->Port=LEDIpPort;
            //ClientSocket1->Open();
            ClientSocket1->Active=true;
            ClientSocket1->Socket->SendBuf(buf,bufIndex);


            //ClientSocket1->Close();
        }
        catch(...)
        {
            //
        }
}
void __fastcall TMainFrm::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)

{
   ///客户端读取信息
 try
 {
  AnsiString Msg=Socket->ReceiveText();
  unsigned char buf[100];
    if(Msg.Length()<99)
    {
    strcpy(buf,Msg.c_str());
    String ss="";
    for(int i=0;i<Msg.Length();i++)
    {
      ss+=IntToHex(buf[i],2);
      ss+=",";
    }
    InfoLedEdt->Text=ss;
    }
    ///判断是不是自己发出的信息
    //  if(Msg!=Memo2->Lines->Strings[Memo2->Lines->Count-1])
    //  Memo2->Lines->Add(Msg);
 }
 catch(...)
 {
     //
 }
}
void __fastcall TMainFrm::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket)

{
 try
 {
 AnsiString Msg="连接成功-"  + Socket->RemoteHost +"[地址]" + Socket->RemoteAddress + "[端口]" + IntToStr(Socket->RemotePort);
 InfoLedEdt->Text=Msg;
 }
 catch(...)
 {
     //
 }
}

void __fastcall TMainFrm::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket)

{
  AnsiString Msg="信息显示屏连接断开..." ;
  InfoLedEdt->Text=Msg;
}

//------------------------------------------------

引用:
ClientSocket在bcb2009中 
好像有问题,建议用indy的TIdTcpClient 
 

TIdTcpClient怎么用啊,没有用过,给点提示可以吗? 

问题还是有的,就是显示屏如果不和计算机联网的话,会弹出来SOCKET error对话框,不爽,程序启动也比较慢。如何解决我还没有搞明白

void sendbuf(unsigned char * buf,int bufIndex) { try { //ClientSocket1->Close(); //ClientSocket1->Active=false; //ClientSocket1->Address=LedIp; //ClientSocket1->Port=LEDIpPort; //ClientSocket1->Open(); ClientSocket1->Active=true; ClientSocket1->Socket->SendBuf(buf,bufIndex); //ClientSocket1->Close(); } catch(...) { // } } 去掉ClientSocket1->Active=true; 程序就不会一直弹出来SOCKET error对话框 

 

注意:bcb2009中需要安装socket控件包


[解决办法]
看看这里有socket例子吧:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]

Quote: 引用:

ClientSocket在bcb2009中 
好像有问题,quote]  有什么问题,我现在在2010下好象还好

热点排行