广工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;
}