基于SOCKET发送图片总结.doc_第1页
基于SOCKET发送图片总结.doc_第2页
基于SOCKET发送图片总结.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于socket的图片传输系统设计1 设计思路。本设计利用了socket通信的原理,通过socket建立一个服务端和客户端相互通信并发送图片最后在QT上显示。设计用到知识有:socket编程、多进程的编程、多路I/O复用、QT的编程。2 部分知识解析。socket通信实质以及过程介绍。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型: SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。 Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过 调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind函数原型为:int bind(int sockfd,struct sockaddr *my_addr, int addrlen);面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:int connect(int sockfd, struct sockaddr *serv_addr,int addrlen);Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。 Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。Send()和recv()这两个函数用于面向连接的socket上进行数据传输。Send()函数原型为:int send(int sockfd, const void *msg, int len, int flags);Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。发送图片模块介绍。其实发送图片和一般的发送数据完全一样,在这里在 /home 下有一张图片“1.jpg”,那么建立socket连接后,就要调用fopen函数打开这个图片,注意是以二进制流的方式打开,这样打开之后就可以读取到其中的数据。原型为:fP=fopen(/home/1.jpg,ab),这样打开之后图片就可以读取出来,然后读取到一个数组里。函数原型为:fd=fread(buffer,1,sizeof(fp),fp)这样就可以把buffer里的数据发送到soxket套接字中。图片接收端介绍图片接收端主要是利用QT写的一个服务器的程序。程序如下:QLabel *label=new QLabel (, 0); /初始化qlabel QPixmap pm (/yanjl/qt/qt_jpg/han.jpg); /设定要显示的图片 ui-label-setPixmap(pm); /将图片加载到label上 ui-label-setGeometry( 0, 0, 240, 320 ); /屏幕大小,初始位置QTcpSocket、QtcpServer是在socket的基础上封装各种类,原理都一样,大差不差。QT的特征是信号和槽,实现多线程,比平时要容易很多。1、 侦听QTcpServer.listen(QHostAddress:Any,5023)2、 有连接请求时,QTcpServer产生newConnection()信号,调用nextPendingConnection()接受请求并返回QTcpSocket,就可以用这个类进行通信了。3、 每收到一个数据包,QTcpSocket会readyRead()信号,调用QtcpSocket.readAll()读取数据,读到QByteArray bytearray类型数组里;4、 存成一个图片QFile-write(bytearray),或直接显示成一个图片 Qpixmap.loadFromData(bytearray);3 为何要用到多进程。其实主要考虑到多个客户端相应服务器的问题,就设计了两个进程,一个进程负责linsten一个进程专

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论