向高手请教局域网内图像数据传输的开发思路

pf1685 2007-06-29 04:12:28
大致要求是这样的,在局域网内我有一台计算机作为服务器,以下简称服务器,其它计算机均为客户端,以下简称客户端。在服务器上有一块视频采集卡,我需要将视频采集卡采集的每一帧图像数据压缩后,通过局域网传输给客户端,然后客户端再对接收到的每一帧图像数据进行解码实时显示。

要求:
1。服务器只有一个,客户端有多个
2。请教高手我应该采用什么协议(TCP、UDP等)做比较合理
3。各个客户端不一定要求严格同时播放每一帧数据,但对于每个客户端而言,必须保证不丢失数据,即每一帧数据每个客户端都要能够正确无误的接收到
4。我只关心网络传输控制部分的实现,至于图像的编解码已经实现,在此不做讨论

最好能给我一个源代码例子或告之有相关介绍的网页的网址。同时也欢迎各位高手在此指导,谢谢!
邮箱:pf1685@tom.com
100分送给对我的要求给出帮助的高手,谢谢您们
...全文
684 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
byxdaz 2007-09-04
  • 打赏
  • 举报
回复
其实,你自己的思路很好啊
服务器每发送一帧数据就等待所有的客户端返回一个接收完成标志,如果有一个客户端返回一个接收完成标志,服务器再继续发下一帧数据,接收到完成标志的客户端把帧数据传给其他没有接收到完成标志的客户端.
如果超过一个规定的时间,仍有客户端没有返回标志,判断网络连接是否中断,否则服务器也发送下一帧数据.
pf1685 2007-09-04
  • 打赏
  • 举报
回复
自己顶一把!
pf1685 2007-09-03
  • 打赏
  • 举报
回复
我愿意出一万元人民币请高手帮我做这个软件,请有兴趣的高手与我联系!
QQ:16313237
MSN:pf1685@tom.com
EMAIL:pf1685@tom.com
pf1685 2007-08-30
  • 打赏
  • 举报
回复
我的思路是这样的,服务器每发送一帧数据就等待所有的客户端返回一个接收完成标志再继续发下一帧数据,如果超过一个规定的时间,仍有客户端没有返回标志,服务器也发送下一帧数据,大家觉得怎么样?
我是在局域网传输数据,网络带宽没有问题,100M、1000M甚至光纤。
其实我的要求很简单,只要能建立一对多的网络连接,然后能够传数据就行,就要一个很简单的参考就行,以前没有做过网络程序!
那位高手给我一个例子,或告诉我相关的网页我自己去看去下载。
邮箱:pf1685@tom.com
sjdev 2007-08-23
  • 打赏
  • 举报
回复
Tcp就就可以了。
我们公司所做的一软件,就是实时采集,然后发到服务器上去显示。
pf1685 2007-08-23
  • 打赏
  • 举报
回复
怎么没有可参考开发的回答,郁闷!
dzq138 2007-07-17
  • 打赏
  • 举报
回复
蓝天的视频直播聊天室
xb_luotuo 2007-07-17
  • 打赏
  • 举报
回复
参考一下蓝天的视频直播聊天室,基本模仿它就可以了。
maomaoxu12365 2007-07-13
  • 打赏
  • 举报
回复
当在网络中传输的数据是较大的数据块进(如图象),常常会出现阻塞现象。为了避免出现这 种情况,并且提高传输的效率,我们可以使用多线程来进行网络编程。
  32位Windows环境下的Win32 API提供了开发多线程应用程序的接口函数,并且VC++6.0提供 的标准C库也可以开发多线程应用程序,但是更为经常的是使用MFC类库进行多线程编程。MF C执行两种类型的线程,一种是工作线程(Worker Thread);另一种是用户界面线程(User-Int erface Thread)。这两种类型都使用同一Win32 API调用机制,而且Visual C++6.0的 MFC库 提供的CWinThread类是进行多线程编程的基础。实际上,CWinApp类就是一个用户界面线程 ,它由CWinThread类派生,用于应用程序与用户的交互。
  有两种方法可以创建线程。MFC提供如下全局函数创建线程:AfxBeginThread(),用AfxBeg i nThread()可以创建一个线程,MFC提供两个版本的AfxBeginThread()分别用于创工作线程和 用户界面线程。该函数创建一个线程对象,并返回对象的指针(利用这个指针可以完成一些 用户想做的事情)。另外,你也可以显式地创建线程对象,这需要首先声明线程对象,然后 调用CWinThread的成员函数CWinThread::Create Therad()函数创建线程,由于MFC区分两种 线程, 因此创建线程的参数也是不同的,也正是不同的参数区分了不同的线程,这将在下面结合So ckets编程做详细说明。
在VC++6.0中,我们可以用Windows Sockets API来编写网络程序,更为普遍的是,我们使用 MFC封装的CAsyncSocket和CSocket两个类来进行网络编程,它把与套接字有关的Windows消 息换为回调函数,CAsyncSocket类比CSocket更加面向低层,使用比较灵活,但它对编程 人员的要求也高,需要对网络了解的更多。CSocket是CAsyncSocket的导出类,通过MFC中的 CArchive类的对象提供了更高层次的抽象,它封装了Socket实现中的许多细节,并将Socke t与 Archive相结合,使用它与使用MFC中的文档串行化协议相类似,使用便利。一般我们使 用简便的CSocket编程,其步骤如下:
  (1)构造套接字对象。(2)使用该对象构造基本的套接字,对于CSocket客户端对象,使用缺 省参数Create;对于CSocket服务器对象,应指明一个端口号作为Greate的一个参数,用于监 听。(3)建立客户端CSocket,调用CAsyncSocket::Connect建立与服务器端的连接, 服务器 端套接字调用CAsyncSocket::Listen监听,并在收到客户端请求后调用CAsyncSocket::Acce pt。(4)构造CSocketFile对象,并使CSocket对象与之关联。(5)构造CArchive对象,用于接 收或 发送数据。(6)使用CArchive对象来进行客户端与服务器端的套接字通信。(7)删除CArchive ,C SocketFile,CSocket对象。
回调函数的使用
  为了使网络通信更加方便,CAsyncSocket和CSocket提供了一些回调函数。主窗口通过调用 这些回调函数来套接字的一些重要事件的来临。这些回调函数有OnReceive,OnSend,onConne ct,OnAccept,OnClose,它们可以通过在两个类中重载得到。这两个类仅仅是通过回调函数将 消息转化为通知,具体的如何响应这些通知,还须我们自己来实现。
  void CReceSocket::OnReceive(int nErrorCode)

  CAsyncSocket::OnReceive(nErrorCode);
  Receive(lpBuf,int nBufLen,int nFlage=0)

  如果自己的类继承CAsyncSocket,为了使通信更加便利,必须重载这些回调函数,如果自己 的类继承CSocket,将由你根据情况自己决定是否重载它们。必须注意的是,CSocket对象从 不调用OnSend OnConnect这两个通知函数,而只能调用Send函数来发送数据,直到发送完成 有数据Send对返回,同样只能调用Connect函数来进行连接,当完成连接时(成功或失败)Con nect将返回。

CSocket类的缺省方式阻塞方式,为了避免阻塞的种种缺点,可以使用多线程,可以在一个 工作线程中处理数据的接收和发送,该工作线程可以在后台运行,套接字在工作线程中的阻 塞不会影响主线程中的其他活动,这样主线程可以处理主窗口的消息映射,下面结合一个实 例说明如何创建、执行一个套接字工作线程的过程,该线程创建一个套接字,然后与服务器 (IP为202.194.20.250)进行连接,连接成功后向服务器发送一些数据。
UINT SocketProc(LPVOID pParam)

  CSendView*pView=(CSendView*)pParam;
  CSocket*pSocket=new CSocket();
  pSocket->Create(); //构造CSocket对象
  //与服务器连接
  if(!pSocket->Connect("202.194.20.250"5050))
  AfxMessageBox("can'tconnect to the distines!")
  //构造CSocketFile对象,并使 CSocket对象与之关联。
  CSocketFile* m-pFile=new CSocketFile(pSocket);
  //构造CArchive对象,用于发送数据。
  CArchive* m-pArchiveOut=new CArchive(m-pFile,CArchive::STORE)
  if(m-pArchiveOut!=NULL)
  }
   //发送数据,其中m-sockdata是在视窗类中定义的一个结构,
   //pMsg是该结构中的一个指针变量
   pView->m-sockdata->pMsg->Serialize(*m-pArchiveOut)
   m-pArchiveout->Flush()
  }
  else
   return O;

  在程序适当的地方,用AfxBeginThread(SocketProc,pView)来执行即可。
  除了使用工作线程外,还可以使用用户界面线程来实现,用户界面线程增加了消息映射,在 下面的例子中将会用到。
  而CAsyncSocket类可以为了处理阻塞问题,不应该设为阻塞方式,而应使用异步方式。在异 步方式中,调用会立即返回,用GetLastError函数会获取相应的错误代码为WSAEWOULDBLOCK表示无连接可以接受,举例说明,在异步方式中,在调用Receive函数后,会得到WSAEWOULD BLOCK的错误信息,直到OnReceive回调函数被调用以通知我们可以再次接收数据了。
使用多线程进行套接字编程时应注意同步问题
  在使用多线程技术进行网络编程时,必须注意套接字对象的同步问题,可以使用线程同步机 制来协调套接字对象的存取。
  如果在线程中创建了一个MFC窗口对象,这个MFC对象不能在其他线程中使用,即对于套接字 编程来说,一个套接字对象应该仅仅用于单个线程,在两个线程之间不能传递套接字对象。 例如;服务器一般可以接受多个连接,它每接受一个连接,就创建一个线程用来处理连接。 为达到这个目的,仅仅在这两个线程中传递套接字对象的不够的。
  虽然在两个线程之间不能传递套接字对象,但我们可以在线程之间传递线程句柄。因此我们 可以:
  (1)把附加接受连接的线程的套接字对象上的套接字句柄分离出来。
  (2)在两个线程中传递套接字句柄。
  (3)在处理套接字连接的线程中,把这个套接字句柄附加到套接字对象上。
  为了更好的说明以上方法,现将程序的部分列出:
//在主线程中创建监听线程的OnAccept函数
void CListenSocket::OnAccept(int nErrorCode)

  CAsyncSocket soc;//用于接受连接请求而建的临时对象
  Accept(soc);//接受请求
   //创建新线程并挂起(该线程是用户界面线程)
  CSockThread*pThread=(CSockThread*)AfxBeginThread(
   RUNTIME-CLASS(CSockThread),THREAD-PRIORITY-NORMAL.
   O,CREATE-SUSPENDED);
   //将套接字句柄从套接字对象中分离出来,并保存
  pThread->m-hSocket=(SOCKET)SOC.Detach();
   //开始执行新线程
  pThread->ResumeThread();
  CAsyncSocket::OnAccept(nErrorCode);

  //处理连接线程(即新线程)的InitInstance函数,
BOOL CSockThread::InitInstance()
   //把这个套接字句柄附加到新的套接字对象上,
   //这样主线程的通知函数就能发送到新的线程中,在新的线程中处理
  m-socket,Attach(m-hSocket);
  return TRUE;

  通过以上步骤,我们就可以用多线程处理网络通信了。
在开发电子教室系统过程中,我们利用网络编程实现了教师机和学生机之间的连续图像的传 输,传输效果相当令人满意。我们利用CAsyncSocket和CSocket两个类分别实现了图象在网 络上传输。两个类实现的效果相差无几,不过由于CSocket类可以使用CArchive对象之间传递数据,并且引入了多线程技术进行网络通信以避免阻塞,CSocket类完全可以满足图像通 信的要求。
  由于客户机和服务器程序的通信模块都是用套接字开发的网络通信程序,因此屏蔽了网络层 的复杂的结构和协议,使应用软件能在各种网上运行,而不必关心是何种网络以及服务器 或客户机在网上的具体位置和数据传送细节。


fox1999 2007-07-13
  • 打赏
  • 举报
回复
至于图像的编解码已经实现,在此不做讨论

-----------------
你的圖像壓了以後有多大?

每幀有多少Byte 數據?
如果大了,絕對做不到實時.
1秒 30幀

這類問題,網絡模型是次要的。關鍵還是圖像處理這裡。

網絡模型一般都是 UDP 組播,但不能保證每幀數據都能收到,也不保證收到的數據絕對正確。
lyg_zy 2007-07-04
  • 打赏
  • 举报
回复
关注。
pf1685 2007-07-04
  • 打赏
  • 举报
回复
没人回答了,看来这个方案并不容易!
pf1685 2007-07-02
  • 打赏
  • 举报
回复
谢谢各位指点,请问有没有一个具体明确的方案思路,最好能给一个例子或告之相关介绍的网址,谢谢!
邮箱:pf1685@tom.com
taianmonkey 2007-07-02
  • 打赏
  • 举报
回复
看看VNC吧
gudyn 2007-07-02
  • 打赏
  • 举报
回复
组播
pf1685 2007-07-02
  • 打赏
  • 举报
回复
找了好久都没有找到内似的例子,好象这些东西介绍得比较少
我不是做视频会议,因为视频会议有相互交互,我只需要服务器把每一帧图像数据传给每个客户端,并且保证每个客户端都准确无误并且完整的接收所有数据就行。
那位高手给我一点明确的思路,或给一个例子。
邮箱:pf1685@tom.com
200分送给帮助我的那位朋友,谢谢!
CathySun118 2007-06-30
  • 打赏
  • 举报
回复
建议看看完成端口模式
pf1685 2007-06-29
  • 打赏
  • 举报
回复
希望高手帮我解决该问题,给出详细思路,又开了一帖,再送100分
http://community.csdn.net/Expert/TopicView3.asp?id=5628445
muroachanf 2007-06-29
  • 打赏
  • 举报
回复
tcp udp都差不多,主要就是个数据出错重传的问题,你给每个包或一段包加个md5码,最后验证下就好了。
leon7909 2007-06-29
  • 打赏
  • 举报
回复
当然是使用组播更高效,但是“对于每个客户端而言,必须保证不丢失数据”这一点的话,就需要在组播的基础上加入丢失重传机制。实现起来不复杂

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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