日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

基于socket的线上聊天框

發布時間:2025/4/5 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于socket的线上聊天框 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聊天框1.0

使用說明:
  • 要求Linux環境,虛擬機或者WSL均可

  • 命令行執行 g++ Server.cpp -o Server 和 g++ Client.cpp -o Client 進行編譯

  • 線程A在命令行執行 ./Server 5005,線程B在命令行執行 ./Client 127.0.0.1 5005

  • 雙端輪流輸入對話內容,目前僅支持一人一句不能連續多句

  • 任一方輸入 拜拜 結束通信

  • ?

    服務端工作流程:
  • 創建socket
  • 把IP地址和端口綁定到socket上
  • 設置socket為監聽模式
  • 接受客戶端的連接請求
  • 與客戶端重復通信,直到通信結束
  • 關閉socket,釋放資源
  • ?

    客戶端工作流程:
  • 創建socket
  • 向服務端發起連接請求
  • 與服務端通信,通信結束后斷開連接
  • 關閉socket,釋放資源
  • ?

    ?

    C++源碼

    Server端
    #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>int main(int argc, char *argv[]) {if (argc != 2){printf("請輸入端口號!\n\n");return -1;}// 第1步:創建服務端的socket。int listenfd;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}// 第2步:把服務端用于通信的地址和端口綁定到socket上。struct sockaddr_in servaddr; // 服務端地址信息的數據結構。memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET; // 協議族,在socket編程中只能是AF_INET。servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 使用任意ip地址。//servaddr.sin_addr.s_addr = inet_addr("192.168.190.134"); // 使用指定ip地址。servaddr.sin_port = htons(atoi(argv[1])); // 指定通信端口。if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0){perror("bind");close(listenfd);return -1;}// 第3步:把socket設置為監聽模式。if (listen(listenfd, 5) != 0){perror("listen");close(listenfd);return -1;}// 第4步:接受客戶端的連接。int clientfd; // 客戶端的socket。int socklen = sizeof(struct sockaddr_in); // struct sockaddr_in的大小struct sockaddr_in clientaddr; // 客戶端的地址信息。clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, (socklen_t *)&socklen);printf("客戶端(%s)已連接。\n", inet_ntoa(clientaddr.sin_addr));// 第5步:與客戶端通信,接收客戶端發過來的報文后,回復ok。char buffer[1024];int iret;while (1){memset(buffer, 0, sizeof(buffer));if ((iret = recv(clientfd, buffer, sizeof(buffer), 0)) <= 0) // 接收客戶端的請求報文。{ printf("沒收到這條信息!\n");}else{printf("對方:%s\n", buffer);}if (!strcmp(buffer, "拜拜")){printf("\n結束與對方通信!\n");break;}memset(buffer, 0, sizeof(buffer));printf("我:");scanf("%[^\n]", buffer);char c = getchar();if ((iret = send(clientfd, buffer, strlen(buffer), 0)) <= 0) // 向客戶端發送響應結果。{printf("這條信息沒發出去!\n");}if (!strcmp(buffer, "拜拜")){printf("\n對方已結束通信!\n");break;}}// 第6步:關閉socket,釋放資源。close(listenfd);close(clientfd); }

    ?

    Client端
    #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>int main(int argc, char *argv[]) {if (argc != 3){printf("請輸入ip地址和端口!\n\n");return -1;}// 第1步:創建客戶端的socket。int sockfd;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}// 第2步:向服務器發起連接請求。struct hostent *h;if ((h = gethostbyname(argv[1])) == 0) // 指定服務端的ip地址。{printf("gethostbyname failed.\n");close(sockfd);return -1;}struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2])); // 指定服務端的通信端口。memcpy(&servaddr.sin_addr, h->h_addr, h->h_length);if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) // 向服務端發起連接清求。{perror("connect");close(sockfd);return -1;}// 第3步:與服務端通信,發送一個報文后等待回復,然后再發下一個報文。char buffer[1024];int iret;while (1){memset(buffer, 0, sizeof(buffer));printf("我:");scanf("%[^\n]", buffer);char c = getchar();if ((iret = send(sockfd, buffer, strlen(buffer), 0)) <= 0) // 向服務端發送請求報文。{printf("\n發送失敗,通信結束!\n");break;}if (!strcmp(buffer, "拜拜")){printf("\n結束與對方通信!\n");break;}memset(buffer, 0, sizeof(buffer));if ((iret = recv(sockfd, buffer, sizeof(buffer), 0)) <= 0) // 接收服務端的回應報文。{printf("\n接收失敗,通信結束\n");break;}printf("對方:%s\n", buffer);if (!strcmp(buffer, "拜拜")){printf("\n對方已結束通信!\n");break;}}// 第4步:關閉socket,釋放資源。close(sockfd); }

    ?

    效果演示:
    Server端

    Client端


    ?
    有關socket可以查看Socket進程通信

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的基于socket的线上聊天框的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。