聊天框1.0

使用说明:
  1. 要求Linux环境,虚拟机或者WSL均可

  2. 命令行执行 g++ Server.cpp -o Serverg++ Client.cpp -o Client 进行编译

  3. 线程A在命令行执行 ./Server 5005,线程B在命令行执行 ./Client 127.0.0.1 5005

  4. 双端轮流输入对话内容,目前仅支持一人一句不能连续多句

  5. 任一方输入 拜拜 结束通信

服务端工作流程:
  1. 创建socket
  2. 把IP地址和端口绑定到socket上
  3. 设置socket为监听模式
  4. 接受客户端的连接请求
  5. 与客户端重复通信,直到通信结束
  6. 关闭socket,释放资源
客户端工作流程:
  1. 创建socket
  2. 向服务端发起连接请求
  3. 与服务端通信,通信结束后断开连接
  4. 关闭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的线上聊天框相关推荐

  1. 基于Socket的多人聊天雏形(java实现)

    基于Socket的多人聊天 思路 服务器端 主线程代码 注册线程代码 轮询线程代码 客户端 思路 网络上的聊天本质上属于数据的交互,一个服务方负责接收客户端发来的信息,并进行进一步处理.因为此次实验是 ...

  2. 基于socket.io的web聊天室

    基于socket.io的web聊天室 一. 项目介绍 该项目使用node.js作为后端服务器框架,并利用socket.io来实现web聊天室功能.socket.io是由 JavaScript 实现的基 ...

  3. Hack.Chat 在浏览器里快速建立简单、随用即丢线上聊天室,无须下载安装软体

    From:http://www.luoxiao123.cn/1554-6.html 有时候想跟其他使用者线上文字对话,但又不想把自己的联络资料(例如 Facebook 或即时通讯帐号)泄漏给对方,有些 ...

  4. 《Windows高级调试》译者线上聊天活动获奖网友名单

    <Windows高级调试>译者线上聊天活动获奖网友名单 小菜鸟 请站短读书频道,留下您的联系方式. 请获奖者务必于<?xml:namespace prefix = st1 ns = ...

  5. 基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...

  6. 基于JAVA校园线上点餐系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA校园线上点餐系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA校园线上点餐系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  7. 基于JAVA餐厅线上点菜系统计算机毕业设计源码+系统+lw文档+部署

    基于JAVA餐厅线上点菜系统计算机毕业设计源码+系统+lw文档+部署 技术栈 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui.HTML.CSS. ...

  8. 课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统

    课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM 前端框架 ...

  9. (附源码)计算机毕业设计ssm基于Android的线上水果店

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

最新文章

  1. JDBC--代码实现增删改查、及SQL注入问题解决
  2. js不完全入门之数组
  3. LInux main.cpp 编码问题 导致影响后面的内容
  4. 【推荐】一个不错的密码强度测试网站
  5. 机器学习与统计学的本质差异
  6. ios 防止按钮快速点击造成多次响应的避免方法。
  7. Chapter 1 First Sight——30
  8. Oracle用户system解锁
  9. vulhub安装教程
  10. idhttp.post方式 调用datasnap rest 远程方法(转咏南兄)
  11. Android之Input子系统事件分发流程
  12. 【转】Add a user/Administrator to Windows Server 2008
  13. python冰雪奇缘使用教程_99 行 Python 代码实现《冰雪奇缘》特效?网友:大神碉堡!...
  14. java进制转换工具(图形界面版)
  15. 证券公司信息化4_最核心的IT系统是什么?柜台系统的两个主要功能?一个交易过程是怎样的?
  16. 拟合美国人口matlab编码,预测美国人口 - MATLAB Simulink Example - MathWorks 中国
  17. 固态硬盘是什么接口_ssd固态硬盘是什么意思,有什么好处,固态硬盘和机械硬盘的区别...
  18. GOF23式——Prototype
  19. (邱维声)高等代数课程笔记:基,维数与坐标
  20. 【C语言结构体题】定义用于存储学生信息的结构体数组,输入学生的准考证号、姓名和成绩信息,计算总分,并按总分由高到低输出。

热门文章

  1. struts中select标签的使用
  2. overall error
  3. 关于单CPU,多CPU上的原子操作
  4. irrlicht1.3中文支持
  5. (int)a和(int)a的区别
  6. 求正负数交互序列的和的MFC版
  7. Linux内核编译学习1
  8. Spring.net 类库目录
  9. Spring.Net官网翻译
  10. Openwrt WIFI探针开发【一】