基于socket的图片传输系统设计

一.设计思路。

本设计利用了socket通信的原理,通过socket建立一个服务端和客户端相互通信并发送图片最后在QT上显示。设计用到知识有:socket编程、多进程的编程、多路I/O复用、QT的编程。

二.部分知识解析。

socket通信实质以及过程介绍。

Socket接口是TCP/IP网络的APISocket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。
       为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain, inttype, int protocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型: SOCK_STREAM SOCK_DGRAMSocket接口还定义了原始SocketSOCK_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,structsockaddr *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, constvoid *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 ); //屏幕大小,初始位置

QTcpSocketQtcpServer是在socket的基础上封装各种类,原理都一样,大差不差。QT的特征是信号和槽,实现多线程,比平时要容易很多。

1、 侦听QTcpServer.listen(QHostAddress::Any,5023)

2、 有连接请求时,QTcpServer产生newConnection()信号,调用nextPendingConnection()接受请求并返回QTcpSocket,就可以用这个类进行通信了。

3、 每收到一个数据包,QTcpSocketreadyRead()信号,调用QtcpSocket.readAll()读取数据,读到QByteArray  bytearray类型数组里;

4、 存成一个图片QFile->write(bytearray),或直接显示成一个图片    Qpixmap.loadFromData(bytearray);

 

三.为何要用到多进程。

其实主要考虑到多个客户端相应服务器的问题,就设计了两个进程,一个进程负责linsten一个进程专门处理 accept,这样就可以实现多个客户端相互连接。

四.系统最后截图如下:

1. 运行程序,准备连接

图一    执行QT服务端程序  开始接受客户端连接
2.
客户端运行,准备发送图片。

 

图二   开始运行客户端程序,准备传送图片。

图三。QT正正在接受图片瞬间截图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值