基于socket的线上聊天框
生活随笔
收集整理的這篇文章主要介紹了
基于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
雙端輪流輸入對話內容,目前僅支持一人一句不能連續多句
任一方輸入 拜拜 結束通信
?
服務端工作流程:
?
客戶端工作流程:
?
?
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進程通信
總結
以上是生活随笔為你收集整理的基于socket的线上聊天框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【进程通信】Socket
- 下一篇: PIC单片机 按键检测识别