white chess
http://www.cnblogs.com/tornadomeet/archive/2012/06/28/2568634.html
#include "chessboard.h"
#include "pieces.h"
#include <QtGui>
#include <math.h>
chessboard::chessboard(QWidget *parent)
: QWidget(parent)
{
resize(640,480);
setWindowTitle(tr("五子棋 白棋"));
color=true;
blackchessed = false;
connect(this,SIGNAL(click()),this,SLOT(judge()));
winbLabel=new QLabel(this);
winwLabel=new QLabel(this);
winbLabel->setGeometry(500,120,100,30);
winwLabel->setGeometry(500,210,100,30);
QLabel *blackLabel=new QLabel(this);
QLabel *whiteLabel=new QLabel(this);
whoseturnLabel=new QLabel(this);
whoseturnLabel->setGeometry(460,50,111,28);
blackLabel->setGeometry(460,120,28,28);
whiteLabel->setGeometry(460,210,28,28);
whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
QPixmap pixb(":/img/black.png");
QPixmap pixw(":/img/white.png");
blackLabel->setPixmap(pixb);
whiteLabel->setPixmap(pixw);
QCommandLinkButton *regret = new QCommandLinkButton(this);
// regret->setGeometry(480,250,80,48);
// regret->setText(tr("悔棋"));
regret->setGeometry(480,250,120,48);
regret->setText(tr("重新开始"));
regret->setDefault(true);
QCommandLinkButton *regret1 = new QCommandLinkButton(this);
regret1->setGeometry(480,300,80,48);
// regret->setGeometry(480,250,120,48);
regret1->setText(tr("悔棋"));
regret1->setDefault(true);
sender = new QUdpSocket(this);
receiver = new QUdpSocket(this);
// receiver->bind(45454,QUdpSocket::ShareAddress); //白棋
receiver->bind(45454,QUdpSocket::ShareAddress); //白棋 黑棋给白棋发数据的时候必须用白棋这个端口才能找到这个应用
connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
connect(regret,SIGNAL(clicked()),this,SLOT(on_regret_clicked()));
connect(regret1,SIGNAL(clicked()),this,SLOT(on_regret1_clicked())); //悔棋
}
chessboard::~chessboard(){}
void chessboard::processPendingDatagram() //处理等待的数据报
{
while(receiver->hasPendingDatagrams()) //拥有等待的数据报
{
QByteArray datagram; //拥于存放接收的数据报
datagram.resize(receiver->pendingDatagramSize()); //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
receiver->readDatagram(datagram.data(),datagram.size()); //接收数据报,将其存放到datagram中
qDebug()<<datagram;
if(datagram == "button")
{
regret();
}
else if(datagram == "abc")
{
regretclean();
}
else if(datagram == "abc1")
{
regretclean1();
}
else if(datagram == "button1")
{
regret1();
}
else
{
//把QByteArray转换成qstring
QString string;
string = QString(datagram);
//把qstring转换成int
int data;
data=string.toInt();
//解压缩数据
int i,j;
i = data/100;
j = data%100;
p=new pieces(pieces::black,i,j);
blackchessed = true;
list.append(p);
p->setParent(this);
p->show();
whoseturnLabel->setText(QObject::tr("<h1>请白棋下!</h1>"));
blackchessed = true;
emit click();
}
}
}
/*画棋盘 */
void chessboard::paintEvent(QPaintEvent *e){
QPainter paint(this);
QPixmap pixbg(":/img/123123.jpg"); //设置背景图片
paint.drawPixmap(0,0,pixbg);
paint.drawRect(30,30,420,420); //画外框
for(int i=0;i<13;i++) //画横线
paint.drawLine(30,i*30+60,450,i*30+60);
for(int i=0;i<13;i++) //换竖线
paint.drawLine(i*30+60,30,i*30+60,450);
}
/*下棋*/
void chessboard::mousePressEvent(QMouseEvent *e){
int count;
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
{
for(count=0;count<list.size();count++)
{
if(list.at(count)->getX()==i&&list.at(count)->getY()==j)
{
m=i;
n=j;
c=count;
break;
}
}
if(sqrt(pow(30+j*30-e->x(),2)+pow(30+i*30-e->y(),2))<=13&&count==list.size())
{
//画棋子之前先判断对方(黑棋)有没有下
if(blackchessed)
{
//压缩需要发送的信息
int temp;
char compress[4];
temp= j%10 + (j/10)*10 + (i%10)*100 +(i/10)*1000 ;//+col
sprintf(compress,"%d",temp);
//udp发送
QByteArray datagram = QByteArray(compress);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45450);
p=new pieces(pieces::white,i,j);
list.append(p);
p->setParent(this);
p->show();
whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
blackchessed = false;
}
else
return;
}
}
emit click();
}
/*判断是否五子相连*/
void chessboard::judge(){
for(int i=0;i<5;i++){ //判断左右
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getX()-i+j)==list.at(count)->getX()&&p->getY()==list.at(count)->getY()
&&p->getColor()==list.at(count)->getColor())
n++;
}
if(n==5){
win(p->getColor());
reset();
}
}
for(int i=0;i<5;i++){ //判断上下
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getY()-i+j)==list.at(count)->getY()&&p->getX()==list.at(count)->getX()
&&p->getColor()==list.at(count)->getColor())
n++;
}
if(n==5){
win(p->getColor());
reset();
}
}
for(int i=0;i<5;i++){ //判断左上右下
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()-i+j)==list.at(count)->getX()
&&p->getColor()==list.at(count)->getColor())
n++;
}
if(n==5){
win(p->getColor());
reset();
}
}
for(int i=0;i<5;i++){ //判断右上左下
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()+i-j)==list.at(count)->getX()
&&p->getColor()==list.at(count)->getColor()){
n++;
}
}
if(n==5){
win(p->getColor());
reset();
}
}
}
void chessboard::win(int c){
if(c==pieces::black){
winbLabel->setText(tr("<h1>黑棋赢了!</h1>"));
}
else
winwLabel->setText(tr("<h1>白棋赢了!</h1>"));
}
/*重新开局 */
void chessboard::reset()
{ int a;
if(p->getColor()==pieces::black){
//int a=QMessageBox::information(this,tr("提示"),tr("是否再来一盘?"),QMessageBox::Ok);//,QMessageBox::Cancel
a=QMessageBox::information(this,tr("提示"),tr("黑棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
}
else
a=QMessageBox::information(this,tr("提示"),tr("白棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
// int a=QMessageBox::information(this,tr("提示"),tr("是否再来一盘?"),QMessageBox::Ok);//,QMessageBox::Cancel
if(a==QMessageBox::Ok)
{
for(int i=0;i<list.size();i++){
list.at(i)->close();
}
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=true;
}
}
//悔棋
void chessboard::on_regret_clicked()
{
char regretbutton[7]="button";
//udp发送
QByteArray datagram = QByteArray(regretbutton);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45450); //白棋的端口都是
}
//悔棋的窗口
void chessboard::regret()
{
int a=QMessageBox::information(this, tr("注意"),
tr("对方选择重新开始,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
if(a==QMessageBox::Ok)
{
char compress[4]="abc";
//udp发送
QByteArray datagram = QByteArray(compress);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45450);
for(int i=0;i<list.size();i++)
{
list.at(i)->close();
}
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=false;
}
}
//悔棋后重开始
void chessboard::regretclean()
{
for(int i=0;i<list.size();i++)
{
list.at(i)->close();
}
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=false;
}
悔棋按钮
// void chessboard::on_regret1_clicked()
// {
// char regretbutton[8]="button1";
// //udp发送
// QByteArray datagram = QByteArray(regretbutton);
// sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
// 45450);
//}
悔棋的窗口
//void chessboard::regret1()
//{
// int a=QMessageBox::information(this, tr("注意"),
// tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
// if(a==QMessageBox::Ok)
// {
// //udp发送
// char compress[4]="abc";
// QByteArray datagram = QByteArray(compress); //数据包
// sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
// 45454);
list.at(c+1)->close();
list.clear();
// list.at(c+1)->close();//删除刚才下的第c号棋子
// list.clear();
// winbLabel->setText(tr(""));
// winwLabel->setText(tr(""));
// color=true;
// }
//}
对方点击ok,悔棋后重开始
// void chessboard::regretclean1()
// {
list.at(c+1)->close();//删除刚才下的第c号棋子
list.clear();
// list.at(c+1)->close();//删除刚才下的第c号棋子
// list.clear();
// winbLabel->setText(tr(""));
// winwLabel->setText(tr(""));
// color=false;
//}
//悔棋按钮
void chessboard::on_regret1_clicked()
{
char regretbutton[8]="button1";
//udp发送
QByteArray datagram = QByteArray(regretbutton);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45450);
}
//悔棋的窗口
void chessboard::regret1()
{
int a=QMessageBox::information(this, tr("注意"),
tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
if(a==QMessageBox::Ok)
{
//udp发送
char compress[4]="abc";
QByteArray datagram = QByteArray(compress); //数据包
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45454);
// list.at(c+1)->close();
// list.clear();
list.at(c+1)->close();//删除刚才下的第c号棋子
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=true;
}
}
//对方点击ok,悔棋后重开始
void chessboard::regretclean1()
{
// list.at(c+1)->close();//删除刚才下的第c号棋子
// list.clear();
list.at(c+1)->close();//删除刚才下的第c号棋子
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=false;
}
// //悔棋按钮
// void chessboard::on_regret1_clicked()
// {
// char regretbutton[8]="button1";// '/0'结束符占一位
// //udp发送
// QByteArray datagram = QByteArray(regretbutton);
// sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
// 45450);
// }
// //悔棋的窗口
// void chessboard::regret1()
// {
// int a=QMessageBox::information(this, tr("注意"),
// tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
// if(a==QMessageBox::Ok)
// {
//udp发送
char compress[4]="abc";
QByteArray datagram = QByteArray(compress); //数据包
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45450);
list.at(c)->close();//删除刚才下的第c号棋子
//list.at(c-1)->close();//删除刚才下的第c号棋子
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=true;
// //udp发送
// char compress1[5]="abc1";
// QByteArray datagram1 = QByteArray(compress1); //数据包
// sender->writeDatagram(datagram1.data(),datagram1.size(),QHostAddress::Broadcast,
// 45454);
char compress1[4]="abc";
QByteArray datagram1 = QByteArray(compress1); //数据包
sender->writeDatagram(datagram1.data(),datagram1.size(),QHostAddress::Broadcast,
45454);
// list.at(c)->close();//删除刚才下的第c号棋子
// //list.at(c-1)->close();//删除刚才下的第c号棋子
// list.clear();
// winbLabel->setText(tr(""));
// winwLabel->setText(tr(""));
// color=true;
// }
// }
// //对方点击ok,悔棋后重开始
// void chessboard::regretclean1()
// {
list.at(c+1)->close();//删除刚才下的第c号棋子
//list.at(c-1)->close();//删除刚才下的第c号棋子
list.clear();
// list.at(c)->close();//删除刚才下的第c号棋子
// //list.at(c-1)->close();//删除刚才下的第c号棋子
// list.clear();
// winbLabel->setText(tr(""));
// winwLabel->setText(tr(""));
// color=false;
// }
black chess
//参考:http://www.cnblogs.com/tornadomeet/archive/2012/06/28/2568634.html
#include "chessboard.h"
#include "pieces.h"
#include <QtGui>
#include <math.h>
#include <QDebug>
//qt writedatagram 是udp协议
chessboard::chessboard(QWidget *parent)
: QWidget(parent)
{ //frame 对话框
resize(640,480);
setWindowTitle(tr("五子棋 黑棋"));
color=true;
whitechessed = true;
connect(this,SIGNAL(click()),this,SLOT(judge()));
//“谁赢了标签”
winbLabel=new QLabel(this);
winwLabel=new QLabel(this);
winbLabel->setGeometry(500,120,100,30);
winwLabel->setGeometry(500,210,100,30);
QLabel *blackLabel=new QLabel(this);
QLabel *whiteLabel=new QLabel(this);
blackLabel->setGeometry(460,120,28,28);
whiteLabel->setGeometry(460,210,28,28);
QPixmap pixb(":/img/black.png");
QPixmap pixw(":/img/white.png");
blackLabel->setPixmap(pixb); //加载图片
whiteLabel->setPixmap(pixw);
whoseturnLabel=new QLabel(this);
whoseturnLabel->setGeometry(460,50,111,28); //请黑棋下的位置
whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
QCommandLinkButton *regret = new QCommandLinkButton(this);
// regret->setGeometry(480,250,80,48);
regret->setGeometry(480,250,120,48);
regret->setText(tr("重新开始"));
regret->setDefault(true);
QCommandLinkButton *regret1 = new QCommandLinkButton(this);
regret1->setGeometry(480,300,80,48);
// regret->setGeometry(480,250,120,48);
regret1->setText(tr("悔棋"));
regret1->setDefault(true);
sender = new QUdpSocket(this); //联网关键
receiver = new QUdpSocket(this);
receiver->bind(45450,QUdpSocket::ShareAddress);//黑棋(本地方,自己方)的端口 黑棋是接听接受者 如果修改这个端口则白棋就喘不过来了
connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
connect(regret,SIGNAL(clicked()),this,SLOT(on_regret_clicked()));
connect(regret1,SIGNAL(clicked()),this,SLOT(on_regret1_clicked())); //悔棋
}
chessboard::~chessboard(){}
/*画棋盘*/
void chessboard::paintEvent(QPaintEvent *e)
{
QPainter paint(this);
QPixmap pixbg(":/img/321.png"); //设置背景图片
paint.drawPixmap(0,0,pixbg);
paint.drawRect(30,30,420,420); //画外框
for(int i=0;i<13;i++) //画横线
paint.drawLine(30,i*30+60,450,i*30+60);
for(int i=0;i<13;i++) //换竖线
paint.drawLine(i*30+60,30,i*30+60,450);
}
/**下棋**/
void chessboard::mousePressEvent(QMouseEvent *e)
{
int count;
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
{
for(count=0;count<list.size();count++)
{
if(list.at(count)->getX()==i&&list.at(count)->getY()==j) //按下标的形式访问容器。得到刚下棋子的横纵坐标
{
c=count;
m=i;
n=j;
break;
}
}//每一个下过的棋子
if(sqrt(pow(30+j*30-e->x(),2)+pow(30+i*30-e->y(),2))<=13&&count==list.size())
{
//画棋子之前先判断对方(白棋)有没有下
if(whitechessed)
{
//压缩需要发送的信息
int temp;
char compress[4];
temp= j%10 + (j/10)*10 + (i%10)*100 +(i/10)*1000;// 个位 十位 。。
sprintf(compress,"%d",temp);//int 转换成 string
//udp发送
QByteArray datagram = QByteArray(compress);//字符串转为QByteArray
//一个udpSocket已经于一个端口bind在一起了,这里的data是out流中的data,最多可以传送8192个字节,但是建议不要超过
//512个字节,因为这样虽然可以传送成功,但是这些数据需要在ip层分组,QHostAddress::Broadcast是指发送数据的目的地址
//这里为本机所在地址的广播组内所有机器,即局域网广播发送
//发给白棋自己所下棋子的位置数据
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45454);//给45454白棋发送数据
//画黑棋子
{
p=new pieces(pieces::black,i,j);
}
list.append(p);
p->setParent(this);
p->show();
whoseturnLabel->setText(QObject::tr("<h1>请白棋下!</h1>"));
whitechessed = false;
}
else
return;
}
}
emit click();//发射一个点击信号,判断输赢
}
/*判断是否五子相连 */
void chessboard::judge(){
for(int i=0;i<5;i++){ //判断左右
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getX()-i+j)==list.at(count)->getX()&&p->getY()==list.at(count)->getY()
&&p->getColor()==list.at(count)->getColor())
n++;
}
if(n==5){
win(p->getColor());
reset();
}
}
for(int i=0;i<5;i++){ //判断上下
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getY()-i+j)==list.at(count)->getY()&&p->getX()==list.at(count)->getX()
&&p->getColor()==list.at(count)->getColor())
n++;
}
if(n==5){
win(p->getColor());
reset();
}
}
for(int i=0;i<5;i++){ //判断左上右下
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()-i+j)==list.at(count)->getX()
&&p->getColor()==list.at(count)->getColor())
n++;
}
if(n==5){
win(p->getColor());
reset();
}
}
for(int i=0;i<5;i++){ //判断右上左下
int n=0;
for(int j=0;j<5;j++){
for(int count=0;count<list.size();count++)
if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()+i-j)==list.at(count)->getX()
&&p->getColor()==list.at(count)->getColor()){
n++;
}
}
if(n==5){
win(p->getColor());
reset();
}
}
}
void chessboard::win(int c){
if(c==pieces::black){
winbLabel->setText(tr("<h1>黑棋赢了!</h1>"));
}
else
winwLabel->setText(tr("<h1>白棋赢了!</h1>"));
}
/*重新开局*/
void chessboard::reset(){
int a;
if(p->getColor()==pieces::black){
//int a=QMessageBox::information(this,tr("提示"),tr("是否再来一盘?"),QMessageBox::Ok);//,QMessageBox::Cancel
a=QMessageBox::information(this,tr("提示"),tr("黑棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
}
else
a=QMessageBox::information(this,tr("提示"),tr("白棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
if(a==QMessageBox::Ok){
for(int i=0;i<list.size();i++){
list.at(i)->close();
}//关闭列表
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=true;
}
}
//当对面出棋后这边画出来
void chessboard::processPendingDatagram() //处理等待的数据报
{
while(receiver->hasPendingDatagrams()) //拥有等待的数据报
{
QByteArray datagram; //拥于存放接收的数据报
datagram.resize(receiver->pendingDatagramSize()); //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
receiver->readDatagram(datagram.data(),datagram.size()); //接收数据报,将其存放到datagram中
qDebug()<<datagram;
if(datagram == "button")
{
regret();
}
else if(datagram == "abc")
{
regretclean();
}
else if(datagram == "abc1")
{
regretclean1();
}
else if (datagram == "button1")//悔棋
{
regret1();
}
else
{
//把QByteArray转换成qstring 数据报是QByteArray形式
QString string;
string = QString(datagram);
//把qstring转换成int
int data;
data=string.toInt();
//解压缩数据
int i,j;
i = data/100;//得到前两位 也就是砍掉后两位
j = data%100;//得到后两位
p=new pieces(pieces::white,i,j);
list.append(p);
p->setParent(this);
p->show();
whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
whitechessed = true;
emit click();
}
}
}
//悔棋按钮
void chessboard::on_regret_clicked()
{
char regretbutton[7]="button";// '/0'结束符占一位
//udp发送
QByteArray datagram = QByteArray(regretbutton);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45454);
}
//重新开始的窗口
void chessboard::regret()
{
int a=QMessageBox::information(this, tr("注意"),
tr("对方选择重新开始,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
if(a==QMessageBox::Ok)
{
//udp发送
char compress[4]="abc";
QByteArray datagram = QByteArray(compress);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45454);
for(int i=0;i<list.size();i++)
{
list.at(i)->close();
}
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=true;
}
}
//对方点击ok,悔棋后重开始
void chessboard::regretclean()
{
for(int i=0;i<list.size();i++)
{
list.at(i)->close();
}
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=false;
}
//悔棋功能都没实现
//悔棋按钮
void chessboard::on_regret1_clicked()
{
char regretbutton[8]="button1";// '/0'结束符占一位
//udp发送
QByteArray datagram = QByteArray(regretbutton);
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45454);//以广播的形式发送到45454端口
}
//悔棋的窗口
void chessboard::regret1()
{
int a=QMessageBox::information(this, tr("注意"),
tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
if(a==QMessageBox::Ok)
{
// //udp发送
// char compress[5]="abc1";
// QByteArray datagram = QByteArray(compress); //数据包
// sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
// 45454);
//udp发送
char compress[4]="abc";
QByteArray datagram = QByteArray(compress); //数据包
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
45454);
list.at(c)->close();
// list.at(c-1)->close();//删除刚才下的第c号棋子
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=true;
}
}
//对方点击ok,悔棋后重开始
void chessboard::regretclean1()
{
list.at(c)->close();//删除刚才下的第c号棋子
//list.at(c-1)->close();//删除刚才下的第c号棋子
list.clear();
winbLabel->setText(tr(""));
winwLabel->setText(tr(""));
color=false;
}
广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机(由IP地址确定)内的两进程(由端口号确定)间存在一条连接。http://www.cnpaf.net/Class/TCPANDIP/200408/316.html
udp可以通过广播的形式传给多人,广播只可以在局域网传播。