文章目录

  • 1.前言
  • 2.效果展示
  • 2.socket(套接字)介绍
  • 3.代码实现
  • 4.参考
  • 5.拓展与延伸

1.前言

希望大家合着参考资料一起看,对初入网络编程的童鞋更加友好。

2.效果展示

客户端:

服务器端:

2.socket(套接字)介绍

SOCKET中文翻译过来就是套接字的意思。
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。(来自百度百科)

对套接字这个概念有点迷糊?没有关系,我们最重要的是知道如何使用它,要通过TCP/IP再网络中进行通信,对方的IP地址和端口号肯定是要知道的吧,我们只需要将IP地址和端口号写入套接字中,再通过操控套接字,向套接字中灌入信息,或者从套接字中取出信息,就可以实现向已知的IP地址和端口号所指向的应用程序进行通信了。
简而言之,套接字就是系统提供给应用程序用来进行网络操作的接口。

3.代码实现

服务器端代码:

//此代码在vs2020中实测能编译成功
//在devc++中编译需要在 项目->属性->参数->连接器->加入库或者对象 中选择libws2_32.a库并添加
//操控socket需要使用winsock.h库
#include <winsock.h>
#include <iostream>
//添加编译命令
#pragma comment(lib,"ws2_32.lib")
using namespace std;
//initwsa函数用来初始化socket,WSA是windows socket api 的简写
int initwsa();
int main() {/*在此程序中,我们需要定义两个套接字,在网络中每时每刻有太多消息,我们首先需要用第一个套接字s_server来监听,当到来的消息指定的IP地址和端口号都对的上的时候,就将其放行,并放入缓冲区,如果缓冲中没有其他消息,就将与第二个套接字s_accept与其进行连接并进行通信,通信完成后再与缓冲区的下一个进行连接。*/SOCKET s_accept;SOCKET s_server;SOCKADDR_IN server_addr;SOCKADDR_IN accept_addr;if (!initwsa())return 0;server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY是本机所有网卡所有IP地址的意思server_addr.sin_port = htons(5010);s_server = socket(AF_INET, SOCK_STREAM, 0);//绑定套接字if (bind(s_server, (SOCKADDR*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {cout << "套接字绑定失败!!" << endl;WSACleanup();return 0;}else {cout << "套接字绑定成功!!" << endl;}//设置监听if (listen(s_server, SOMAXCONN) < 0) {cout << "设置监听失败!!" << endl;WSACleanup();return 0;}else {cout << "设置监听成功!!" << endl;}cout << "服务端正在监听连接,请稍后......" << endl;//连接int len = sizeof(SOCKADDR);s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);if (s_accept == SOCKET_ERROR) {cout << "连接失败!!" << endl;WSACleanup();return 0;}cout << "连接建立,准备接受数据!!" << endl;char recv_buf[100];char send_buf[100];int recv_len = 0;int send_len = 0;while (1) {//收发消息recv_len = recv(s_accept, recv_buf, 100, 0);if (recv_len < 0) {cout << "接受失败!!" << endl;}else {cout << "客户端消息:" << recv_buf << endl;}cout << "请输入回复消息:";cin >> send_buf;send_len = send(s_accept, send_buf, 100, 0);if (send_len < 0) {cout << "发送消息失败!!" << endl;break;}}closesocket(s_server);closesocket(s_accept);WSACleanup();return 0;}
int initwsa() {WSADATA wsaDATA;if (!WSAStartup(MAKEWORD(2, 2), &wsaDATA)) {cout << "初始化套接字字库成功!!" << endl;return 1;}else {cout << "初始化套接字字库失败!!" << endl;return 0;}
}

客户端代码

//编译要求同服务器端代码相同
#include <winsock.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int initwsa();
int main() {SOCKET s_server;SOCKADDR_IN server_addr;cout << "请输入要连接的IP地址:" << endlchar ipadd[50];cin >> ipadd;if (!initwsa())return 0;server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = inet_addr(ipadd);server_addr.sin_port = htons(5010);s_server = socket(AF_INET, SOCK_STREAM, 0);//发起连接if (connect(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "服务器连接失败!!" << endl;WSACleanup();return 0;}else {cout << "服务器连接成功!!" << endl;}char recv_buf[100];char send_buf[100];int recv_len = 0;int send_len = 0;while (1) {//收发消息cout << "请输入回复消息:";cin >> send_buf;send_len = send(s_server, send_buf, 100, 0);if (send_len < 0) {cout << "发送消息失败!!" << endl;break;}recv_len = recv(s_server, recv_buf, 100, 0);if (recv_len < 0) {cout << "接受失败!!" << endl;}else {cout << "服务端消息:" <<recv_buf<< endl;}}closesocket(s_server);WSACleanup();return 0;}
int initwsa() {WSADATA wsaDATA;if (!WSAStartup(MAKEWORD(2, 2), &wsaDATA)) {cout << "初始化套接字字库成功!!" << endl;return 1;}else {cout << "初始化套接字字库失败!!" << endl;return 0;}
}

4.参考

socket库参考资料:socket编程c++
原代码链接:原代码

5.拓展与延伸

给大家出几个可以拓展的点子:
1.与文件打包程序绑定在一起实现将文件上传到服务器
2.加入数据库实现多客户端的在线聊天室
3.与小游戏绑定实现全球排行榜功能

c++:利用socket基于TPC/IP实现通信 在线聊天相关推荐

  1. python——通过socket实现服务器端和客户端的在线聊天

    前言:本文讲解涉及到python中socket函数用法,需要巩固基础知识的可以查看下面博客 python--Socket网络编程(详细讲解)(一)_xiaofengdada的博客-CSDN博客_soc ...

  2. 利用Socket 本地和服务器之间通信(小白萌新适用之绝对能运行版)

    Java利用Socket 实现本地和服务器之间通信(小白萌新适用之绝对能运行版) 常规部署 1.先在自己本地跑通 客户端: Socket s = new Socket("localhost& ...

  3. python socket基于TCP/IP协议实现多人聊天室

    文章目录 前言 一.实现原理 二.queue队列 三.代码实现 四.需要注意的地方 五.总结 前言 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字 ...

  4. 基于Server-Sent Event的简单在线聊天室

    一.Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览 ...

  5. 微信小程序 WebSocket 通信 —— 在线聊天

    在Node栏目就讲到了Socket通信的内容,使用Node实现Socke通信,还使用两个流行的WebSocket 库,ws 和 socket.io,在小程序中的WebSocket接口和HTML5的We ...

  6. 基于Vue+Java实现的在线聊天APP系统设计与实现

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85595798 一.需求分析 1.核心用户分析 在线聊天系统主要针对一些年轻用户群体以及 ...

  7. 基于Java语言的Web在线聊天室

    在线聊天室 能够实现登录,注册,聊天功能,最终效果如下图所示 注册页面 <%@ page language="java" contentType="text/htm ...

  8. 基于Vite + Vue3 + Typescript 实现在线聊天项目

    前言 本项目是本人的毕业设计,在校的时候看着同学都都开始一步一步的开始准备毕设了,刚好那段时间正在了解websocket,于是有了个想法,毕设能不能做一个在线聊天的系统. 前端技术用到了 Vue3 + ...

  9. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用 ...

最新文章

  1. VS2010安装项目的系统必备中添加.NET 2.0
  2. IE9真的支持CSS3和HTML5?
  3. 用IoT放羊养牛,不出门也能知道它们的动向
  4. springboot秒杀课程学习整理1-1
  5. 午后随笔 -- 定位的思考
  6. 201771010126 王燕《面向对象设计 java》第十五周实验总结
  7. js中的内置对象(详细篇)
  8. 海南大学信号与系统838考研经验(3)
  9. IOS Websocket (一) Starscream实现Websocket通讯
  10. 谁说EMC、IBM不能替换,还你一个存储虚拟化的真相!
  11. fullscreen mode and windowed mode
  12. 关于Jetson TX2刷机各种问题(刷机后键盘等等奇葩错误)
  13. pwm调速流程图小车_51单片机智能小车《pwm调速按键控制小车动作》
  14. HDMI转换芯片——MS9288C
  15. 支付宝小程序动态绑定样式
  16. RDP是什么意思?有什么用?
  17. AMD网站更新:披露Radeon M400移动GPU产品线
  18. Yolov5 windows下的环境搭建及训练
  19. dvorak在win 和Linux中文输入法的日常用法
  20. Python 网络爬虫实战:爬取知乎回答中的全部图片

热门文章

  1. 如何设计一个秒杀系统
  2. 助力“双创”提质提速,柳枝行动再出发
  3. 万字马原知识点整理(三小时速成版,过过过90+)
  4. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 电商之14.0 Zookeeper 分布式锁实现原理
  5. 第十四届全国大学生数学竞赛河南赛区(非数学类)决赛试题+参考解答发布
  6. LODOP设置纸张无效问题
  7. linux游戏object怎么玩,用Object Detection玩第一人称射击游戏
  8. RK3588虚拟摄像头方案?
  9. python groupby apply_python – 使用自己的函数优化groupby.apply
  10. 中科蓝讯AB536X系列芯片PWM使用说明