国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt實現(xiàn)簡易的多線程TCP服務(wù)器(附源碼)

這篇具有很好參考價值的文章主要介紹了Qt實現(xiàn)簡易的多線程TCP服務(wù)器(附源碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一.UI界面的設(shè)計

二.服務(wù)器的啟動

三.實現(xiàn)自定義的TcpServer類

1.在widget中聲明自定義TcpServer類的成員變量

2.在TcpServer的構(gòu)造函數(shù)中對于我們聲明的m_widget進行初始化,m_widget我們用于后續(xù)的顯示消息等,說白了就是主界面的更新顯示等

四.實現(xiàn)自定義的TcpSocket類

1.TcpSocket.h?? 先忽略掉信號與槽函數(shù),關(guān)注構(gòu)造函數(shù)與qintptr類型的 m_sockDesc

五.實現(xiàn)自定義線程類

1.主要關(guān)注run函數(shù),其中run函數(shù)是繼承QThread中的虛函數(shù),需要我們進行重寫

2.實現(xiàn)某個客戶端斷開連接時通過信號與槽讓主界面改變

3.實現(xiàn)有新的客戶端連接時主界面更新

六.服務(wù)器收到多客戶端消息進行顯示的流程實現(xiàn)

七.服務(wù)器發(fā)送消息給某個客戶端流程

八.服務(wù)器發(fā)送信息后,要在主頁面信息消息更新顯示的流程

注意:

效果演示:

源碼下載地址:


在初學(xué)Qt 中Tcp服務(wù)器與客戶端的時候,發(fā)現(xiàn)每次服務(wù)器只能和最后一個連接的客戶端進行通信,因為沒有用到多線程以及TcpServer中虛函數(shù)incomingConnection(),當新的客戶端連接的時候,會自動調(diào)用incomingConnection函數(shù),在里面產(chǎn)生新的線程來處理通信。

以下來講講這個簡易的多線程Tcp服務(wù)器的實現(xiàn)

一.UI界面的設(shè)計

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

其中包括2個Label,一個LineEdit,兩個pushbutton,上面是一個TextBrowser用于服務(wù)器顯示通信記錄,下面一個TextEdit用于發(fā)送信息。這樣一個簡單的界面就搭建完成了~~~

二.服務(wù)器的啟動

首先我們肯定需要實現(xiàn)點擊啟動服務(wù)器按鈕來啟動服務(wù)器

1.在界面中右擊啟動按鈕 ----> 轉(zhuǎn)到槽

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

2.實現(xiàn)邏輯,這里直接放代碼,其中serverisworking 是我在widget.h 中聲明的一個bool類型,用于判斷服務(wù)器是否啟動,同時更改按鈕的文本顯示內(nèi)容,以及彈出對話框提示。

//點擊開始啟動服務(wù)器
void Widget::on_pushButton_StartServer_clicked()
{
    //如果服務(wù)器沒有啟動
     if (!this->serverisworking) {
        if(this->m_tcpserver->listen(QHostAddress::Any,ui->lineEdit_Port->text().toUShort())){
            QMessageBox::information(this,"成功!","啟動成功!");
            ui->pushButton_StartServer->setText("關(guān)閉服務(wù)器");
            this->serverisworking = true;
        }
        else {
            QMessageBox::critical(this,"失敗!","服務(wù)器啟動失敗請檢查設(shè)置!");
        }
    }
    //如果服務(wù)器正在啟動
     else if(this->serverisworking) {
         m_tcpserver->close();
         if(!m_tcpserver->isListening()){
             ui->pushButton_StartServer->setText("啟動服務(wù)器");
             this->serverisworking = false;
             QMessageBox::information(this,"提示","關(guān)閉成功!");
         }
         else {
             QMessageBox::critical(this,"錯誤","關(guān)閉失敗,請重試!");
             return;
         }

     }
}

三.實現(xiàn)自定義的TcpServer類

1.首先我們搞清楚,這個類是負責干嘛的?這個類我們要繼承QTcpServer,重寫虛函數(shù)incomingConnetion

2.這是頭文件,如果有報錯,注意看使用#pragma once沒有,因為可能涉及到頭文件重復(fù)包含

//tcpserver.h
#pragma once
#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QObject>
#include<QTcpServer>

#include <widget.h>
#include"serverthread.h"

class TcpServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit TcpServer(QObject *parent = nullptr);

private:

    //重寫虛函數(shù)
    void incomingConnection(qintptr sockDesc);

private:
    
    //用來保存連接進來的套接字,存到ComboBox中
    QList<qintptr> m_socketList;
    
    //再包含一個widget對象
    Widget *m_widget;

};

#endif // TCPSERVER_H

1.在widget中聲明自定義TcpServer類的成員變量

//widget.h
#pragma once
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QMessageBox>
#include"tcpserver.h"

namespace Ui {
class Widget;
}

class TcpServer;

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

public:
    //當有新連接的時候在頁面上顯示
    void showNewConnection(qintptr sockDesc);

    //斷開時顯示
    void showDisconnection(qintptr sockDesc);

    //當服務(wù)器發(fā)送消息后,通知窗口更新消息
    void UpdateServerMsg(qintptr Desc,const QByteArray &msg);


private slots:

    //按鈕被觸發(fā)
    void on_pushButton_StartServer_clicked();

    void on_pushButton_Trans_clicked();


public slots:

    //當服務(wù)器收到客戶端發(fā)送的消息后,更新消息
    void RecvMsg(QString Desc,const QByteArray &msg);


signals :
   void  sendData(qintptr Desc ,const QByteArray &msg);

private:
    Ui::Widget *ui;

    TcpServer *m_tcpserver;

    bool serverisworking;
};

#endif // WIDGET_H

其他的我們先不去討論,這里我們就聲明一個TcpServer類型的m_tcpserver 以及一個bool類型的serverisworking用來判斷服務(wù)器是否在工作

2.在TcpServer的構(gòu)造函數(shù)中對于我們聲明的m_widget進行初始化,m_widget我們用于后續(xù)的顯示消息等,說白了就是主界面的更新顯示等

TcpServer::TcpServer(QObject *parent) : QTcpServer(parent)
{
     m_widget = dynamic_cast<Widget *>(parent);

}

那么,問題來了,我們要重寫TcpServer的incomingConnection函數(shù),里面要涉及到線程,那么我們需要去寫一個自定義的線程類

//當有新的連接進來的時候會自動調(diào)用這個函數(shù),不需要你去綁定信號槽
void TcpServer::incomingConnection(qintptr sockDesc)
{
    //將標識符保存進list
    m_socketList.append(sockDesc);

    //產(chǎn)生線程用于通信
    ServerThread *thread = new ServerThread(sockDesc);

    //窗口中顯示有新的連接
    m_widget->showNewConnection(sockDesc);

    //線程中發(fā)出斷開tcp連接,觸發(fā)widget中顯示斷開
    connect(thread, &ServerThread::disconnectTCP, this,[=]{
         m_widget->showDisconnection(sockDesc);
    });



    //當socket 底層有readyread信號的時候  -> 發(fā)送socket_getmsg信號  -> 發(fā)送socket_getmsg_thread
    //將socket_getmsg_thread 與 widget中 RecvMsg 綁定,RecvMsg 用于處理將收到的消息進行顯示
    connect(thread,&ServerThread::socket_getmsg_thread,this->m_widget,&Widget::RecvMsg);

    //當點擊發(fā)送的時候-> 產(chǎn)生一個SendData 信號  -> 調(diào)用線程中SendDataSlot函數(shù)用于發(fā)送sendData信號來使socket來發(fā)送消息
    connect(this->m_widget,&Widget::sendData,thread,&ServerThread::sendDataSlot);

    //當服務(wù)器給客戶端發(fā)送下消息后,會產(chǎn)生一個writeover信號-> 觸發(fā)線程發(fā)送writeover信號給 Tcpserver -> Tcpserver中widget更新消息
    connect(thread,&ServerThread::writeover,[=](qintptr Desc,const QByteArray &msg){
           m_widget->UpdateServerMsg(Desc,msg);
    });


    thread->start();
}

我們要實現(xiàn)線程類,線程的工作是需要每個線程里面都有一個不同的Tcpsocket類實例,但是我們要在不同的線程里面 工作不同的socket,那么我們可以在一個線程中 去使用套接字標識符(socketDesc)去區(qū)分不同的套接字,然后服務(wù)器也可以通過不同的套接字標識符去進行與不同的套接字進行通信,所以我們需要先去實現(xiàn)一個自定義的TcpSocket類

四.實現(xiàn)自定義的TcpSocket類

1.TcpSocket.h?? 先忽略掉信號與槽函數(shù),關(guān)注構(gòu)造函數(shù)與qintptr類型的 m_sockDesc

為什么是qintptr類型呢,我們查看官方文檔,使用qintpt類型作為參數(shù)更方便,qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

#pragma once
#ifndef SERVERSOCKET_H
#define SERVERSOCKET_H

#include <QObject>
#include<QTcpSocket>



class ServerSocket : public QTcpSocket
{
    Q_OBJECT
public:
    explicit ServerSocket(qintptr socketDesc,QObject *parent = nullptr);

signals:
    void socket_getmsg(QString Desc, const QByteArray &msg);

     void writeover(qintptr Desc,const QByteArray &msg);

public slots:
    void sendData(qintptr Desc, const QByteArray &data);

private:
        qintptr m_sockDesc;
};

#endif // SERVERSOCKET_H

五.實現(xiàn)自定義線程類

1.主要關(guān)注run函數(shù),其中run函數(shù)是繼承QThread中的虛函數(shù),需要我們進行重寫

//serverthread.h
#pragma once
#ifndef SERVERTHREAD_H
#define SERVERTHREAD_H

#include <QObject>

#include <QThread>
#include<serversocket.h>

class ServerThread : public QThread
{
    Q_OBJECT
public:

    //構(gòu)造函數(shù)初始化套接字標識符
    explicit ServerThread(qintptr sockDesc,QObject *parent = nullptr);

    void run() override;

    ~ServerThread();

signals:
    void disconnectTCP(qintptr m_sockDesc);

    void sendData(qintptr Desc, const QByteArray& msg);

    void socket_getmsg_thread(QString Desc,const QByteArray &msg);

    void  writeover(qintptr Desc,const QByteArray &msg);

public  slots:
    void sendDataSlot(qintptr Desc, const QByteArray& msg);



private:
    qintptr m_socketDesc;

    ServerSocket *m_socket;

};



#endif // SERVERTHREAD_H

2.實現(xiàn)某個客戶端斷開連接時通過信號與槽讓主界面改變

1)我們在run函數(shù)中,其實就是對某個對應(yīng)的用來通信套接字運行一個線程,所以我們在run中,先對m_socket進行初始化,將自身的m_socketDesc 作為參數(shù)傳給m_socket的有參構(gòu)造。并且使用TcpSocket的setSocketDescriptor方法對m_socket進行綁定標識符,這樣我們每個線程內(nèi)工作的套接字都是不同的

  m_socket = new ServerSocket(this->m_socketDesc);

    //綁定套接字標識符綁定給自定義套接字對象
    if (!m_socket->setSocketDescriptor(this->m_socketDesc)) {
        return ;
    }

2)在線程中,當該線程中的套接字斷開時,底層會發(fā)射出disconnected信號,我們線程可以此信號與一個用來發(fā)射信號的槽函數(shù)綁定起來,實現(xiàn)當套接字發(fā)送disconnect信號的時候,線程發(fā)射出一個disconnectTcp這樣一個自定義信號通知服務(wù)器套接字斷開,server在調(diào)用widget成員的方法實現(xiàn)在主界面中顯示斷開連接

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

 //run()中:
    //當套接字斷開時,發(fā)送底層的disconnected信號
    connect(m_socket, &ServerSocket::disconnected, this, [=]{

        //此信號可以出發(fā)server的槽函數(shù)然后再調(diào)用widget中combobox清除該socketDesc
        emit disconnectTCP(this->m_socketDesc);

        //讓該線程中的套接字斷開連接
        m_socket->disconnectFromHost();//斷開連接

        //線程退出
        this->quit();
    
//incommingConnection中
  //線程中發(fā)出斷開tcp連接,觸發(fā)widget中顯示斷開
    connect(thread, &ServerThread::disconnectTCP, this,[=]{
         m_widget->showDisconnection(sockDesc);
    });
//widget.cpp中
//用以顯示連接斷開
void Widget::showDisconnection(qintptr sockDesc)
{
    ui->textBrowser_ServerMess->append(QString::number(sockDesc)+"斷開了連接");
    
    //通過信號傳遞的標識符,將其刪除
    int index = ui->comboBox_CilentID->findData(sockDesc);

    ui->comboBox_CilentID->removeItem(index);
}

3.實現(xiàn)有新的客戶端連接時主界面更新

當有新的客戶端連接的時候,會自動調(diào)用server中的incommingConnect函數(shù),直接在此函數(shù)中調(diào)用widget->showNewconnection函數(shù)

//incomingConnection函數(shù)中:
    //窗口中顯示有新的連接
    m_widget->showNewConnection(sockDesc);
//widget.cpp
void Widget::showNewConnection(qintptr sockDesc)
{
    ui->textBrowser_ServerMess->append("有新的連接!,新接入"+QString::number(sockDesc));
    ui->comboBox_CilentID->addItem(QString("%1").arg(sockDesc), sockDesc);
}

?通過這兩個連接就可以直接實現(xiàn)有新的客戶端連接時主界面更新。

六.服務(wù)器收到多客戶端消息進行顯示的流程實現(xiàn)

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

//serversocket.cpp
ServerSocket::ServerSocket(qintptr socketDesc,QObject *parent) : QTcpSocket(parent)
{
    this->m_sockDesc = socketDesc;


    connect(this,&ServerSocket::readyRead,this,[=]{

        QString name = QString::number(m_sockDesc);

        QByteArray msg = readAll();

        emit socket_getmsg(name,msg);

    });
}
//serverthread::run()中
    //套接字發(fā)出有消息的信號,然后觸發(fā)線程中發(fā)出有消息的信號
    connect(m_socket, &ServerSocket::socket_getmsg, this,[=](QString Desc,const QByteArray &msg){


                emit socket_getmsg_thread(Desc,msg);

    });
//server.cpp
   //當socket 底層有readyread信號的時候  -> 發(fā)送socket_getmsg信號  -> 發(fā)送socket_getmsg_thread
    //將socket_getmsg_thread 與 widget中 RecvMsg 綁定,RecvMsg 用于處理將收到的消息進行顯示
    connect(thread,&ServerThread::socket_getmsg_thread,this->m_widget,&Widget::RecvMsg);
//widget.cpp
//當客戶端發(fā)送消息,服務(wù)器收到后,顯示消息
void Widget::RecvMsg(QString Desc,const QByteArray &msg)
{
    ui->textBrowser_ServerMess->append(Desc+":"+msg);
}

實現(xiàn)收到客戶端消息進行顯示

七.服務(wù)器發(fā)送消息給某個客戶端流程

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

void Widget::on_pushButton_Trans_clicked()
{
    if(serverisworking){

        //如果連接個數(shù)大于0,發(fā)送發(fā)送消息的信號
        if(ui->comboBox_CilentID->count() >0)
        {
            //發(fā)射 發(fā)送信號
            emit sendData( ui->comboBox_CilentID->currentText().toInt(), ui->textEdit_SendMess->toPlainText().toUtf8());
            qDebug()<<"發(fā)送了sendData信號"<<endl;
            ui->textEdit_SendMess->clear();
        }

    }
    else {
        QMessageBox::critical(this,"錯誤","請檢查連接");
        return;
    }

}
//Tcpserver.cpp  incomingConnection中
    //當點擊發(fā)送的時候-> 產(chǎn)生一個SendData 信號  -> 調(diào)用線程中SendDataSlot函數(shù)用于發(fā)送sendData信號來使socket來發(fā)送消息
    connect(this->m_widget,&Widget::sendData,thread,&ServerThread::sendDataSlot);
void ServerThread::sendDataSlot(qintptr Desc, const QByteArray &msg)
{

     emit sendData(Desc, msg);
}
//run()中
   connect(this,&ServerThread::sendData,m_socket,&ServerSocket::sendData);
void ServerSocket::sendData(qintptr Desc, const QByteArray &msg)
{
    if (Desc == m_sockDesc && !msg.isEmpty()) {
        this->write(msg);

        //發(fā)送完畢,發(fā)出信號,通知主頁面更新聊天框
        emit writeover(Desc,msg);
    }
}

八.服務(wù)器發(fā)送信息后,要在主頁面信息消息更新顯示的流程

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

void ServerSocket::sendData(qintptr Desc, const QByteArray &msg)
{
    if (Desc == m_sockDesc && !msg.isEmpty()) {
        this->write(msg);

        //發(fā)送完畢,發(fā)出信號,通知主頁面更新聊天框
        emit writeover(Desc,msg);
    }
}
//serverthread.cpp
    //socket 發(fā)送 writeorver 通知線程發(fā)送writeover 用來提醒server中的widget更新消息
    connect(m_socket,&ServerSocket::writeover,this,[=](qintptr Desc, const QByteArray& msg){
            emit writeover(Desc,msg);
    });
//server.cpp
    //當服務(wù)器給客戶端發(fā)送下消息后,會產(chǎn)生一個writeover信號-> 觸發(fā)線程發(fā)送writeover信號給 Tcpserver -> Tcpserver中widget更新消息
    connect(thread,&ServerThread::writeover,[=](qintptr Desc,const QByteArray &msg){
           m_widget->UpdateServerMsg(Desc,msg);
    });
//widget.cpp
//當服務(wù)器發(fā)送消息后,通知主窗口更新信號
void Widget::UpdateServerMsg(qintptr Desc, const QByteArray &msg)
{
    ui->textBrowser_ServerMess->append("服務(wù)器:"+msg+" to "+QString::number(Desc));
}

注意:

注冊自定義信號參數(shù),否則信號槽機制使用時會出現(xiàn)保存

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    qRegisterMetaType<qintptr>("qintptr");
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

效果演示:

qtcpsocket服務(wù)器搭建多線程,Qt,服務(wù)器,qt,tcp/ip

源碼下載地址:

yuanzhaoyi/My_project at master (github.com)https://github.com/yuanzhaoyi/My_project/tree/master文章來源地址http://www.zghlxwxcb.cn/news/detail-854530.html

到了這里,關(guān)于Qt實現(xiàn)簡易的多線程TCP服務(wù)器(附源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • QT實現(xiàn)TCP服務(wù)器客戶端的實現(xiàn)

    QT實現(xiàn)TCP服務(wù)器客戶端的實現(xiàn)

    ser: widget.cpp: widget.h widget.ui cli: widget.cpp widget.h widget.ui:

    2024年02月08日
    瀏覽(16)
  • 【Linux后端服務(wù)器開發(fā)】封裝線程池實現(xiàn)TCP多線程通信

    目錄 一、線程池模塊 Thread.h LockGuard.h ThreadPool.h 二、任務(wù)模塊模塊 Task.h 三、日志模塊 Log.h 四、守護進程模塊 Deamon.h ?五、TCP通信模塊 Server.h Client.h server.cpp client.cpp 關(guān)于TCP通信協(xié)議的封裝,此篇博客有詳述: 【Linux后端服務(wù)器開發(fā)】TCP通信設(shè)計_命運on-9的博客-CSDN博客 線程池

    2024年02月16日
    瀏覽(26)
  • QT實現(xiàn)tcp服務(wù)器客戶端
  • 基于Qt的多線程TCP即時通訊軟件的設(shè)計與實現(xiàn)

    基于Qt的多線程TCP即時通訊軟件的設(shè)計與實現(xiàn)

    本文將從涉及到主要技術(shù)開始,講解使用Qt來實現(xiàn)一個支持多客戶端鏈接的 多線程TCP服務(wù)器 及其 客戶端 的設(shè)計與實現(xiàn)的解決方案。 注:本文使用的開發(fā)環(huán)境為Qt5.15.2, 使用MSVC2019_64編譯器, C++11及以上 接下來我將會詳細講解客戶端和服務(wù)端的設(shè)計與實現(xiàn)的關(guān)鍵細節(jié)。完整的源

    2024年01月16日
    瀏覽(26)
  • 【網(wǎng)絡(luò)編程】實現(xiàn)一個簡單多線程版本TCP服務(wù)器(附源碼)

    【網(wǎng)絡(luò)編程】實現(xiàn)一個簡單多線程版本TCP服務(wù)器(附源碼)

    accept 函數(shù)是在服務(wù)器端用于接受客戶端連接請求的函數(shù),它在監(jiān)聽套接字上等待客戶端的連接,并在有新的連接請求到來時創(chuàng)建一個新的套接字用于與該客戶端通信。 下面是 accept 函數(shù)的詳細介紹以及各個參數(shù)的意義: sockfd: 是服務(wù)器監(jiān)聽套接字的文件描述符,通常是使用

    2024年02月13日
    瀏覽(30)
  • C/S架構(gòu)學(xué)習(xí)之多線程實現(xiàn)TCP并發(fā)服務(wù)器

    并發(fā)概念: 并發(fā)是指兩個或多個事件在 同一時間間隔 發(fā)生; 多線程實現(xiàn)TCP并發(fā)服務(wù)器的實現(xiàn)流程: 一、創(chuàng)建套接字(socket函數(shù)): 通信域選擇IPV4網(wǎng)絡(luò)協(xié)議、套接字類型選擇流式; 二、填充服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體: 1.定義網(wǎng)絡(luò)信息結(jié)構(gòu)體變量; 2.求出結(jié)構(gòu)體變量的內(nèi)存

    2024年02月06日
    瀏覽(28)
  • QT實現(xiàn)TCP通信(服務(wù)器與客戶端搭建)

    QT實現(xiàn)TCP通信(服務(wù)器與客戶端搭建)

    創(chuàng)建一個QTcpServer類對象,該類對象就是一個服務(wù)器 調(diào)用listen函數(shù)將該對象設(shè)置為被動監(jiān)聽狀態(tài),監(jiān)聽時,可以監(jiān)聽指定的ip地址,也可以監(jiān)聽所有主機地址,可以通過指定端口號,也可以讓服務(wù)器自動選擇 當有客戶端發(fā)來連接請求時,該服務(wù)器會自動發(fā)射一個newConnection信號

    2024年02月09日
    瀏覽(26)
  • 簡易TCP服務(wù)器搭建

    簡易TCP服務(wù)器搭建

    目錄 一、套接字及其分類 二、相關(guān)接口函數(shù) 三、TCP服務(wù)器搭建流程 1、創(chuàng)建套接字socket() 2、保存服務(wù)器信息 3、套接字綁定 4、監(jiān)聽客戶端連接請求 5、接收客戶端連接請求 6、數(shù)據(jù)收發(fā) 7、關(guān)閉套接字 四、運行結(jié)果 ????????所謂套接字(Socket),就是對網(wǎng)絡(luò)中不同主機上的

    2023年04月18日
    瀏覽(24)
  • [Linux] 網(wǎng)絡(luò)編程 - 初見TCP套接字編程: 實現(xiàn)簡單的單進程、多進程、多線程、線程池tcp服務(wù)器

    [Linux] 網(wǎng)絡(luò)編程 - 初見TCP套接字編程: 實現(xiàn)簡單的單進程、多進程、多線程、線程池tcp服務(wù)器

    網(wǎng)絡(luò)的上一篇文章, 我們介紹了網(wǎng)絡(luò)變成的一些重要的概念, 以及 UDP套接字的編程演示. 還實現(xiàn)了一個簡單更簡陋的UDP公共聊天室. [Linux] 網(wǎng)絡(luò)編程 - 初見UDP套接字編程: 網(wǎng)絡(luò)編程部分相關(guān)概念、TCP、UDP協(xié)議基本特點、網(wǎng)絡(luò)字節(jié)序、socket接口使用、簡單的UDP網(wǎng)絡(luò)及聊天室實現(xiàn)…

    2024年02月16日
    瀏覽(32)
  • C# Tcplistener,Tcp服務(wù)端,Tcp心跳包服務(wù)器簡易封裝

    C# Tcplistener,Tcp服務(wù)端,Tcp心跳包服務(wù)器簡易封裝

    我最近有個需求要寫Tcp服務(wù)端,我發(fā)現(xiàn)Tcp服務(wù)端的回調(diào)函數(shù)比較麻煩,簡化Tcp的服務(wù),我打算自己封裝一個簡單的Tcp服務(wù)端。 C# TCP應(yīng)用編程三 異步TCP應(yīng)用編程 C# Tcpclient Tcplistener 服務(wù)器接收多個客戶端消息通訊 關(guān)于C#Socket斷開重連問題 我最近有個Tcp服務(wù)端的項目,發(fā)現(xiàn)TcpL

    2024年01月19日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包