QT+网络编程。。适合出学者

来源:互联网 发布:mac没有flash怎么办 编辑:程序博客网 时间:2024/06/01 11:01


                                                                       广工10级

转载请标明来源:http://blog.csdn.net/shiyi_2012/article/details/7391099


先看一下实现的效果:


我的这个qt是客户端,只负责接收数据,所以需要一个服务端来发数据。对于服务端,后面我有提供一个服务端程序,大家也可以随便找一个都可以,只要有发送数据就可以的啦。由图可知,这个qt客户端既可以接受同一台计算机同一个系统的服务端发送的数据,也可以是来自不同系统、不同计算机的服务端程序发送的数据。我们主要是说怎样实现客户端的程序,10行代码就可以啦,是不是很简单。。。。

对于这个程序很简单就可以实现的,首先用designer设计一个窗口,里面放一个按键,一个lineEdit部件和一个listBox就可以啦。按键用信号与槽机制(菜单的connection)与一个函数(我的是connect( )函数)挂钩,该函数的代码填充如下:

#define PORT "5555"
#define MAXDATASIZE 125


#include <qvariant.h>
#include <qdialog.h>
#include <qsocketdevice.h>
#include <qhostaddress.h>

void Form1::Connect()
{
 char buf[MAXDATASIZE];
 QSocketDevice *sockfd;     //定义套接字
 QHostAddress their_addr;  //.定义地址
 
 sockfd = new QSocketDevice(QSocketDevice::Stream);  //初始化套接字
 
 their_addr.setAddress( lineEdit1->text() );  //获取地址

sockfd->connect(their_addr,atoi(PORT));   //绑定地址与端口号


 sockfd->readBlock(buf,MAXDATASIZE);  //接收数据
 printf("******buf == %s\n",buf);     //在总端显示数据

 listBox1->insertItem(buf);   //在标签显示数据
 
}

注意:

1.部件的名字要和程序对应啊。。如:lineEdit1、listBox1

2.服务程序端口号要和服务端对应,我这里都是5555.


然后保存就可以啦。。。。

最后在总端执行qmake以及make就产生可执行文件,执行该文件即可。。。

当然加上汉化,就更好看啦,关于如何汉化,很简单,我的上篇文章就写了。。。。


附上我的服务端程序:

/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>


#define PORT 5555
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5


int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, sendbytes;
int sockfd, client_fd;
char buf[BUFFER_SIZE];


if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)   return;           //socket函数
printf("Socket id = %d\n",sockfd);


server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);
if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1)  return;  //bind绑定函数
printf("Bind success!\n");


if (listen(sockfd, MAX_QUE_CONN_NM) == -1)  return; //listen侦听函数
printf("Listening....\n");

while(1){
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)   return;//accept接收函数  
memset(buf , 0, sizeof(buf));


if ((sendbytes = send(client_fd,"long ge long ge", BUFFER_SIZE, 0)) == -1)     return;//send发送函数

printf("send a message: %s\n", buf);
}

return;
}


原创粉丝点击