找回密码
 立即注册
收起左侧

请教Tcp服务器与客户端通信的问题

11
回复
8316
查看
[复制链接]
累计签到:8 天
连续签到:1 天
来源: 2016-3-10 11:49:56 显示全部楼层 |阅读模式
1Qter豆
大家都知道有局域网与外网的区别,即局域网内多台电脑共用一个外网ip.那么问题来了:
假如局域网内有100万台电脑,它们连接一个服务器都用同一个外网ip,那如果服务器要向其中某一台电脑发送数据,那怎样找到那台电脑呢???
端口的范围大家都知道是0--65535,即使这100万台电脑都分别使用不同的端口号,那端口号也不够用啊.
请问这样的多用户与服务器通信该怎样做???看网上说可以用到多线程,对于多线程的服务器与客户端通信我不太清楚,希望能详细说明下,谢谢!!!

回复

使用道具 举报

累计签到:8 天
连续签到:1 天
2016-3-10 11:51:13 显示全部楼层
@yafeilinux   @a408815041  请求帮忙
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2016-3-10 14:36:43 显示全部楼层
TCP中,客户端与客户端的区别是套间字……
回复

使用道具 举报

累计签到:8 天
连续签到:1 天
2016-3-10 17:49:57 显示全部楼层
cai901022 发表于 2016-3-10 14:36
TCP中,客户端与客户端的区别是套间字……

不懂,关于多客户端与服务器通信,你能说得详细点吗?
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2016-3-10 22:15:34 显示全部楼层
这个问题有点专业了,可以搜索一下子网划分。
回复

使用道具 举报

累计签到:410 天
连续签到:1 天
2016-3-12 09:20:26 显示全部楼层
内网与外网。。。长连接 就不用管是谁了吧
回复

使用道具 举报

累计签到:43 天
连续签到:1 天
2016-3-14 21:18:37 显示全部楼层
按mac地址进行广播~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

累计签到:8 天
连续签到:1 天
2016-3-21 13:09:51 显示全部楼层
NCpiro 发表于 2016-3-14 21:18
按mac地址进行广播~~~~~~~~~~~~~~~~~~~~~

能说具体点吗?最好有个源代码什么的
回复

使用道具 举报

累计签到:43 天
连续签到:1 天
2016-3-21 19:31:07 显示全部楼层
//TCP server

#include "server.h"
#include "ui_server.h"
#include <QtNetwork>

Server::Server(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
    tcpServer = new QTcpServer(this);
    // 使用了IPv4的本地主机地址,等价于QHostAddress("127.0.0.1")
    if (!tcpServer->listen(QHostAddress:ocalHost, 6666)) {
        qDebug() << tcpServer->errorString();
        close();
    }
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()));
}

Server::~Server()
{
    delete ui;
}

void Server::sendMessage()
{
    // 用于暂存我们要发送的数据
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    // 设置数据流的版本,客户端和服务器端使用的版本要相同
    out.setVersion(QDataStream:t_4_0);
    out << (quint16)0;
    out << tr("hello TCP!!!");
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    // 获取已经建立的连接的套接字
    QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(disconnected()),
            clientConnection, SLOT(deleteLater()));
    clientConnection->write(block);
    clientConnection->disconnectFromHost();
    // 发送数据成功后,显示提示
    ui->label->setText("send message successful!!!");
}
回复

使用道具 举报

累计签到:43 天
连续签到:1 天
2016-3-21 19:31:55 显示全部楼层
//TCP Client

#include "client.h"
#include "ui_client.h"
#include <QtNetwork>

Client::Client(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket(this);
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
}

Client::~Client()
{
    delete ui;
}

void Client::newConnect()
{
    // 初始化数据大小信息为0
    blockSize = 0;
    // 取消已有的连接
    tcpSocket->abort();
    tcpSocket->connectToHost(ui->hostLineEdit->text(),
                             ui->portLineEdit->text().toInt());
}

void Client::readMessage()
{
    QDataStream in(tcpSocket);
    // 设置数据流版本,这里要和服务器端相同
    in.setVersion(QDataStream:t_4_6);
    // 如果是刚开始接收数据
    if (blockSize == 0) {
        //判断接收的数据是否大于两字节,也就是文件的大小信息所占的空间
        //如果是则保存到blockSize变量中,否则直接返回,继续接收数据
        if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
        in >> blockSize;
    }
    // 如果没有得到全部的数据,则返回,继续接收数据
    if(tcpSocket->bytesAvailable() < blockSize) return;
    // 将接收到的数据存放到变量中
    in >> message;
    // 显示接收到的数据
    qDebug() << message;
    ui->messageLabel->setText(message);
}

void Client::displayError(QAbstractSocket::SocketError)
{
    qDebug() << tcpSocket->errorString();
}

// 连接按钮
void Client:n_connectButton_clicked()
{
    newConnect();
}

回复

使用道具 举报

累计签到:43 天
连续签到:1 天
2016-3-21 19:33:30 显示全部楼层
以上例程来自《QT Creator快速入门》第18章,打包:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:8 天
连续签到:1 天
2016-3-21 23:05:26 显示全部楼层
NCpiro 发表于 2016-3-21 19:33
以上例程来自《QT Creator快速入门》第18章,打包:

我买了这本书的,我看过,这里面没有涉及这方面的内容
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了