基于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进程通信
基于socket的线上聊天框相关推荐
- 基于Socket的多人聊天雏形(java实现)
基于Socket的多人聊天 思路 服务器端 主线程代码 注册线程代码 轮询线程代码 客户端 思路 网络上的聊天本质上属于数据的交互,一个服务方负责接收客户端发来的信息,并进行进一步处理.因为此次实验是 ...
- 基于socket.io的web聊天室
基于socket.io的web聊天室 一. 项目介绍 该项目使用node.js作为后端服务器框架,并利用socket.io来实现web聊天室功能.socket.io是由 JavaScript 实现的基 ...
- Hack.Chat 在浏览器里快速建立简单、随用即丢线上聊天室,无须下载安装软体
From:http://www.luoxiao123.cn/1554-6.html 有时候想跟其他使用者线上文字对话,但又不想把自己的联络资料(例如 Facebook 或即时通讯帐号)泄漏给对方,有些 ...
- 《Windows高级调试》译者线上聊天活动获奖网友名单
<Windows高级调试>译者线上聊天活动获奖网友名单 小菜鸟 请站短读书频道,留下您的联系方式. 请获奖者务必于<?xml:namespace prefix = st1 ns = ...
- 基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署
基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...
- 基于JAVA校园线上点餐系统计算机毕业设计源码+系统+数据库+lw文档+部署
基于JAVA校园线上点餐系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA校园线上点餐系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
- 基于JAVA餐厅线上点菜系统计算机毕业设计源码+系统+lw文档+部署
基于JAVA餐厅线上点菜系统计算机毕业设计源码+系统+lw文档+部署 技术栈 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui.HTML.CSS. ...
- 课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统
课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM 前端框架 ...
- (附源码)计算机毕业设计ssm基于Android的线上水果店
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
最新文章
- JDBC--代码实现增删改查、及SQL注入问题解决
- js不完全入门之数组
- LInux main.cpp 编码问题 导致影响后面的内容
- 【推荐】一个不错的密码强度测试网站
- 机器学习与统计学的本质差异
- ios 防止按钮快速点击造成多次响应的避免方法。
- Chapter 1 First Sight——30
- Oracle用户system解锁
- vulhub安装教程
- idhttp.post方式 调用datasnap rest 远程方法(转咏南兄)
- Android之Input子系统事件分发流程
- 【转】Add a user/Administrator to Windows Server 2008
- python冰雪奇缘使用教程_99 行 Python 代码实现《冰雪奇缘》特效?网友:大神碉堡!...
- java进制转换工具(图形界面版)
- 证券公司信息化4_最核心的IT系统是什么?柜台系统的两个主要功能?一个交易过程是怎样的?
- 拟合美国人口matlab编码,预测美国人口
- MATLAB Simulink Example
- MathWorks 中国
- 固态硬盘是什么接口_ssd固态硬盘是什么意思,有什么好处,固态硬盘和机械硬盘的区别...
- GOF23式——Prototype
- (邱维声)高等代数课程笔记:基,维数与坐标
- 【C语言结构体题】定义用于存储学生信息的结构体数组,输入学生的准考证号、姓名和成绩信息,计算总分,并按总分由高到低输出。