基于Socket的TCP协议Linux聊天系统(即时聊天、传送文件)
基于Socket的TCP协议Linux聊天系统(即时聊天、传送文件)有源码!!!!
- 4.1 需求分析
- 4.1.1 系统目的
- 4.1.2 系统结构图
- 4.1.3 系统功能
- 4.1.4 系统数据流图
- 4.2 概要设计
- 4.2.1 总体设计
- 4.2.2 系统SC图
- 4.3 详细设计
- 4.3.1 套接字设计
- 1. 服务器和客户端连接流程
- 2. 流程图
- 3. 关键代码
- 4.3.2 发送消息
- 1. 流程图
- 2. 关键代码
- 4.3.3 接收消息
- 1. 流程图
- 2. 关键代码
- 4.3.4 发送文件
- 1. 流程图
- 2. 关键代码
- 4.3.5 接收文件
- 1. 流程图
- 2. 关键代码
- 4.4 系统运行结果
- 4.4.1 启动程序、建立连接
- 4.4.2 发送消息、即时聊天
- 4.4.3 发送文件、接收文件
- 4.4.4 功能选择
- 4.4.5 退出
4.1 需求分析
4.1.1 系统目的
完成一个Linux下的网络通信程序,该程序包括服务器和客户端两部分,且能够互相通信,传递消息,传送文件,即时聊天。
4.1.2 系统结构图
4.1.3 系统功能
该系统主要功能为发送接收消息和文件,次要功能为功能选择、退出等。
4.1.4 系统数据流图
该系统是服务器与客户端之间进行通信,同时涉及到文件读取与存储,故还与文件系统有交互,所以抽取出服务器、客户端、文件系统三个交互方。服务器和客户端之间通过系统可以进行消息、文件的收发,同时系统可以处理服务器和客户端的操作,如功能选择、退出等。
系统需要进行初始化,完成连接,服务器可以选择需要的功能,与客户端进行通信,收发并处理数据,可以退出程序。客户端可以选择需要的功能,与服务器进行通信,收发并处理数据,可以退出程序。
系统初始化时服务器建立监听端口,用于与客户端建立连接,客户端会发送地址和端口信息,与服务器建立连接。服务器客户端均可通过功能选择选择收发消息或收发文件的功能。
4.2 概要设计
4.2.1 总体设计
系统分为服务器和客户端两个独立的程序,通过socket进行通信,采用IPv4,TCP协议进行传输。可以通过输入C或F进行选择功能,C为发送消息,F为发送文件。发送消息按下回车后,接收方能够显示收到的消息,发送文件时接收方接收完毕后会显示接收的文件名以及文件存储的位置,同时会反馈给发送方,发送方会显示对方已接收文件。可以通过发送消息模式输入quit退出系统。当选择模式时输入非C或非F,系统会告知用户暂未开通此功能,敬请期待,仍可重新选择功能。
4.2.2 系统SC图
4.3 详细设计
4.3.1 套接字设计
1. 服务器和客户端连接流程
服务器
程序初始化;
持续监听一个固定的端口;
收到Client的连接后建立一个socket连接;
与Client进行通信和信息处理;
接收Client通过socket连接发送来的数据,进行相应处理并返回结果;
通信结束后中断与Client的连接.
客户端
程序初始化;
链接到某个Server上,建立socket连接;
与Server进行通信和信息处理;
接收Server通过socket连接发送来的数据,进行相应处理;
通过socket连接向Server发送请求信息;
通信结束后中断与Server的连接[1].
2. 流程图
3. 关键代码
int get_sockfd()
{
struct sockaddr_in server_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"创建套接字错误:%s\n\a",strerror(errno));
exit(1);
}
else
{
printf("创建套接字成功!\n"); } /*sockaddr结构 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVER_PORT);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
/*绑定服务器的ip和服务器端口号*/
if(bind(sockfd,(struct sockaddr *)(&server_addr), sizeof(server_addr)) == -1){
fprintf(stderr,"端口绑定错误:%s\n\a",strerror(errno));
exit(1);
}
else{
printf("端口绑定成功!\n");
}
/* 设置允许连接的最大客户端数 */
if(listen(sockfd,BACKLOG)==-1){
fprintf(stderr,"监听端口错误:%s\n\a",strerror(errno));
exit(1);
}
else{
printf("端口监听中......\n");
}
return sockfd;
}
4.3.2 发送消息
1. 流程图
2. 关键代码
void sendMsg(char sendbuf[], int socket)
{
printf("你:");
scanf("%s", sendbuf);
if(send(socket, sendbuf, strlen(sendbuf), 0) < 0)
{
printf("消息发送失败!\n");
}
}
4.3.3 接收消息
1. 流程图
2. 关键代码
void receiveMsg(char recvbuf[], char their_name[], int socket)
{
int iDataNum;
printf("%s:", their_name);
recvbuf[0] = '\0';
if((iDataNum = recv(socket, recvbuf, SIZE, 0)) < 0)
{
printf("数据接收失败!\n");
}
recvbuf[iDataNum] = '\0';
printf("%s\n", recvbuf);
}
4.3.4 发送文件
1. 流程图
2. 关键代码
int sendFile(char sendbuf[], char file_name[], int socket)
{// 打开文件并读取文件数据FILE *fp = fopen(file_name, "r");if(NULL == fp){
printf("%s 文件不存在!\n", file_name);}else{
bzero(sendbuf, SIZE);int length = 0;// 每读取一段数据,便将其发送给服务器,循环直到文件读完为止while((length = fread(sendbuf, sizeof(char), SIZE, fp)) > 0){
if(send(socket, sendbuf, length, 0) < 0)
{
printf("%s 发送失败\n", file_name);
break;
}
bzero(sendbuf, SIZE);}fclose(fp);printf("%s 发送成功!\n", file_name);int iDataNum;char recvbuf[SIZE];bzero(recvbuf,SIZE);recvbuf[0] = '\0';//接收对方接收完文件后的反馈信息if((iDataNum = recv(socket, recvbuf, SIZE, 0)) < 0){
printf("数据接收失败!\n");}recvbuf[iDataNum] = '\0';if(strcmp(recvbuf, "success")==0){
printf("对方已接收文件!\n");}}return 0;
}
4.3.5 接收文件
1. 流程图
2. 关键代码
int receiveFile(char recvbuf[], char file_name[], int socket)
{// 打开文件,准备写入FILE *fp = fopen(file_name, "w");if(NULL == fp){
printf("无法写入文件%s.\n", file_name);
exit(1);}// 从服务器接收数据到recvbuf中// 每接收一段数据,便将其写入文件中,循环直到文件接收完并写完为止bzero(recvbuf, SIZE);int length = 0;while(1){
length = recv(socket, recvbuf, SIZE, 0);
if(length > 0){
if(fwrite(recvbuf, sizeof(char), length, fp) < length)
{
printf("写入文件%s失败\n", file_name);
break;
}
bzero(recvbuf, SIZE);
}
break;} fclose(fp);printf("成功接收文件:%s! 文件存储在默认文件夹下(程序所在文件夹).\n", file_name);char sendbuf[SIZE]="success";send(socket, sendbuf, strlen(sendbuf), 0);return 0;
}
4.4 系统运行结果
4.4.1 启动程序、建立连接
4.4.2 发送消息、即时聊天
4.4.3 发送文件、接收文件
4.4.4 功能选择
4.4.5 退出
源码地址:https://github.com/Marigoldwu/Chat
基于Socket的TCP协议Linux聊天系统(即时聊天、传送文件)相关推荐
- 【Java Socket】TCP协议的多人聊天室
最近老师叫我们做一个基于Socket的多人聊天室,网上很多教程都只讲了如何通过Socket来建立连接以及通过控制台一遍打印证明连接已经完成但还没有具体实现多人聊天.这次我整理了一下自己的实现代码,希望 ...
- 网络编程 socket模块 tcp协议 udp协议
网络基础相关知识 , socket模块 , tcp协议通信代码 , tcp和udp编码流程 网络基础相关知识(1) 架构 C / S 架构: client 客户端 和 server 服务器端 优势:能 ...
- 从入门到入土:基于Python采用TCP协议实现通信功能的程序
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- JAVA初学者如何实现基于UDP和TCP协议的网络编程
首先,我们需要先了解UDP协议.TCP协议的概念: 一.UDP协议:用户数据报协议,是一种无连接协议 二.TCP协议:文件传输协议,是一种面向连接的协议 他们都位于TCP/IP模型中的传输层,为整个网 ...
- 基于websocket实现一个简单的IM即时聊天
基于websocket实现一个简单的IM即时聊天 websocket闲聊 如何实现一个简单的聊天程序 实践 代码 效果 登陆 聊天 websocket闲聊 简而言之,就是一种服务器和客户端可以双向通信 ...
- 即时通讯传送文件的方法有几种?
即时通讯是当代人生活中必不可少的应用软件了,无论使用QQ.微信还是钉钉,我们都可以通过这些即时通讯软件来进行信息的交换以及文件的传输. 那么即时通讯传送文件的方法有几种呢?接下来我们一起盘点一下. 即 ...
- 【Linux网络】Linux Socket编程 TCP协议
话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程 ...
- c++使用OpenSSL基于socket实现tcp双向认证ssl(使用TSL协议)代码实现
相信各位对OpenSSL库已经不陌生了,目前笔者使用这个库实现了RSA.AES加解密和tcp的双向认证功能,下面来看tcp的双向认证. 1.什么是双向认证 简单说双向认证就是:客户端认证服务端是否合法 ...
- 网络编程应用:基于TCP协议【实现一个聊天程序】
要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1;import java.io.IOException; import ...
最新文章
- 利用curl下载文件(进度条显示) 代码片段
- 5GS 协议栈 — GTP 协议族
- Python--粒子滤波定位案例程序
- CSDN中的如何转载博文
- Nubiers to follow
- One order search by guid uuid
- iview 下拉select样式_Vue.js相关:iview实现select tree树形下拉框的示例代码
- 宝宝的成长脚印6/15
- Codeforces Round #697 (Div.3) A~G解题报告与解法证明
- python scapy sniffer停止抓包_如果没有收到数据包,如何告诉scapy sniff()停止?
- python模拟浏览器访问百度_selenium与python自动化测试模拟登录百度
- springmvc解决静态资源无法访问的两种方法
- 算法:Reverse String(反转字符串)
- Spring Security(二) UserDetailsService 和 PasswordEncoder 密码解析器 详解
- python turtle 乌龟赛跑_海龟快跑,turtle碰撞检测小游戏
- VCS(DVE)调试
- 【AIS学习】06:AIS缩略语
- YUN人才招聘系统PHP源码v5.1.2
- N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting
- 二叉搜索树的创建、插入、遍历、删除