计算机网络——网络聊天程序的设计与实现

  • 一、实验目的
  • 二、总体设计
    • 1. 基本原理
    • 2. 设计步骤
      • (1)服务器端编程的步骤
      • (2)客户端编程的步骤
  • 三、详细设计
    • 1. 程序流程图
    • 2. 实验代码
      • (1)服务器端
      • (2)客户端
  • 四、实验结果
    • 1. 服务器端
    • 2. 客户端

一、实验目的

了解Socket通信的原理,在此基础上编写一个聊天程序。

二、总体设计

1. 基本原理

socket通信原理是一种“打开——读/写——关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方的内容,通讯结束时关闭文件。
Socket在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。
Socket保证了不同计算机之间的通信,对于网站,通信模型是服务器与客户端之间的通信。两端都建立一个socket对象,然后通过socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。

2. 设计步骤

(1)服务器端编程的步骤

①加载套接字库,创建套接字WSAStartup();
在使用socket之前要进行版本的设定和初始化,应用程序只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数。根据版本初始化windows socket,返回0表示成功。
②创建套接字,使用TCP协议;
有套接字的接口才能进行通信。
③绑定套接字到一个 IP 地址和一个端口上(bind());
用bind()函数确定socket各种属性。
④将套接字设置为监听模式等待连接请求(listen());
⑤请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
accept()是一个阻塞函数,如果没有客户端请求,连接会一直等待在这里。该函数会返回一个新的套接字,这个新的套接字是用来与客户端通信的套接字,之前那个套接字是用来监听的套接字。
⑥用返回的套接字和客户端进行通信(send()/recv());
⑦返回,等待客户端的另一连接请求;
⑧关闭套接字,关闭加载的套接字库(closesocket())。

(2)客户端编程的步骤

①加载套接字库,创建套接字WSAStartup();
要连接的服务器的ip,因为现在服务器端就是本机,所以写本机ip,127.0.0.1一个特殊的IP地址,表示是本机的IP地址。
②向服务器发出连接请求(connect());
如果没有成功连接到服务器,一直循环,直至连接上为止。
③和服务器端进行通信(send()/recv());
④关闭套接字,关闭加载的套接字库(closesocket())。

三、详细设计

1. 程序流程图

2. 实验代码

(1)服务器端

#include<stdio.h>
#include<string.h>
#include<WinSock2.h>
#pragma comment (lib,"ws2_32.lib")
SOCKET sockConn;//全局变量,用来通信的套接字
//把发送消息和接收信息的功能封装成两个函数作为线程使用。
void recvFun();//接收信息线程
void sendFun();//发送信息线程
void createConnect();//创建通信套接字
int flag=0;
HANDLE h1, h2;//线程句柄
int main()
{SOCKET serverSocket;//监视的套接字//SOCKET sockConn;//用来通信的套接字SOCKADDR_IN newAddr;//保存客户端的socket地址信息SOCKADDR_IN addr;//地址结构体,包括ip port(端口)WSADATA data;//存储被WSAStartup函数调用后返回的Windows Sockets数据WORD version;//socket版本int info;//在使用socket之前要进行版本的设定和初始化version = MAKEWORD(2, 2);//设定版本info = WSAStartup(version, &data);/*应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数。根据版本初始化 windows socket,返回0表示成功*/if (info != 0){printf("初始化失败\n");return 0;}if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2){printf("加载失败\n");WSACleanup();return 0;}//创建套接字,使用TCP协议//有套接字的接口才能进行通信serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//AF_INET使用IPV4地址,SOCK_STREAM使用流传输,IPPROTO_TCP使用TCP协议addr.sin_addr.S_un.S_addr = htonl(ADDR_ANY);//表示任何的ip过来连接都接受addr.sin_family = AF_INET;//使用ipv4的地址addr.sin_port = htons(0606);//设定应用占用的端口//用bind()函数确定socket各种属性bind(serverSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR));//将套接字serverSocket与端口0606,接收的ip绑定listen(serverSocket, 3);//开始监听,是否有客服端请求连接,最大连接数为3printf("开始监听,等待客户端连接..........\n");int len = sizeof(SOCKADDR);//accept是一个阻塞函数,如果没有客户端请求,连接会一直等待在这里//该函数会返回一个新的套接字,这个新的套接字是用来与客户端通信的套接字,之前那个套接字是监听的套接字while(1){sockConn=accept(serverSocket,(SOCKADDR*)&newAddr,&len);//接受客户端的请求printf("连接成功......\n");//创建线程后立即运行//第一个参数表示线程内核对象的安全属性;第二个参数表示线程栈空间大小;第三个参数表示新线程所执行的线程函数地址(函数的名字),多个线程可以使用同一个函数地址//第四个参数是传递给线程函数的参数;第五个参数指定什么时候调用线程,为0表示线程创建之后就可以进行调用;第六个参数返回线程的ID号,传入NULL表示不需要返回该线程ID号h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)sendFun, NULL, 0, NULL);//用于发送的线程h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recvFun, NULL, 0, NULL);//用于接收的线程}closesocket(sockConn);//关闭套接字return 0;
}
void sendFun()
{char buf[128];while (1){printf("服务器端的信息:");scanf("%s", buf);//sockConn为用来通信的套接字,buf为发送数据的缓冲区,strlen(buf)+1为发送数据的长度,0位flags标志send(sockConn, buf, strlen(buf) + 1, 0);//发送信息}
}void recvFun()
{char buf[128];while (1){int Ret = recv(sockConn, buf, 128, 0);//接收信息if(Ret<0){printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");printf("客户端已退出,服务器端准备监听\n");flag=flag%2+1;break;}else if(Ret==0){printf("ERROR_RECV");}else{printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");printf("%s%s\n","客户端的信息: ", buf);printf("服务器端的信息:");}}
}

(2)客户端

#include<stdio.h>
#include<string.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
SOCKET sockClient;//全局变量,用于通信的socket
//两个线程用于接收和发送信息
void sendFun();//发送信息线程
void recvFun();//接收信息线程
int main()
{HANDLE h1, h2;//线程句柄,其实就是一串数字用来标识线程对象SOCKADDR_IN addr;int info;WSADATA data;WORD version;//设定版本,与初始化version = MAKEWORD(2, 2);info = WSAStartup(version, &data);if (info != 0){printf("初始化失败\n");return 0;}if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2){printf("加载失败\n");WSACleanup();return 0;}sockClient = socket(AF_INET, SOCK_STREAM, 0);//创建套接字//要连接的服务器的ip,因为现在服务器端就是本机,所以写本机ip//127.0.0.1一个特殊的IP地址,表示是本机的IP地址addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//端口要与服务器相同,不然找不到addr.sin_port = htons(0606);//用IPV4地址addr.sin_family = AF_INET;//主动连接服务器while(1){if(connect(sockClient, (SOCKADDR*)&addr, sizeof(SOCKADDR))==0)break;else;}//创建线程后立即执行h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)sendFun, NULL, 0, NULL);h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recvFun, NULL, 0, NULL);WaitForSingleObject(h1, INFINITE);//会阻塞,直到线程运行结束WaitForSingleObject(h2, INFINITE);shutdown(sockClient,2);closesocket(sockClient);//关闭套接字return 0;
}void sendFun()
{char buf[128];while (1){printf("客户端的信息: ");scanf("%s", buf);//发送数据send(sockClient, buf, strlen(buf) + 1, 0);}
}void recvFun()
{char buf[128];//接收服务发送的数据while (1){int n;if(recv(sockClient, buf, 128, 0)>0){printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");printf("%s%s\n","服务器端的信息: ", buf);printf("客户端的信息:");}else{break;}}
}

四、实验结果

1. 服务器端

2. 客户端

计算机网络——网络聊天程序的设计与实现相关推荐

  1. 计算机网络课程设计之网络聊天程序的设计与实现

    前言 计算机网络课程设计开始,要求用C/C++,而且有些题目还要有图形界面,因此决定用Qt写图形界面,同时决定用一个程序完成所有的实验设计. 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运 ...

  2. 计算机网络课程设计(一)网络聊天程序的设计与实现

    实验题目 网络聊天程序的设计与实现 实验目的 1.了解Socket通信的原理,学会使用Socket进行简单的网络编程,在此基础上编写一个聊天程序. 2.了解Qt编程,熟悉C++语言. 总体设计 1.背 ...

  3. 网络聊天程序的设计与实现

    网络聊天程序的设计与实现 文章目录 网络聊天程序的设计与实现 一.实验题目 二.实验目的 三.背景知识 四.代码 一.实验题目 网络聊天程序的设计与实现 二.实验目的 使用socket编程,了解soc ...

  4. 网络聊天程序的设计与实现 python实现 计算机网络课程设计

    设计内容: 一.了解 Socket 通信的原理,在此基础上编写一个聊天程序. 二.在实现聊天功能的基础上,使用Tkinter实现聊天的界面 代码 server from socket import * ...

  5. C语言实现网络聊天程序的设计与实现(基于TCP协议)

    目录         TCP/IP协议介绍         TCP/IP协议与WinSock网络编程接口的关系         WinSock编程简单流程          VC中socket编程   ...

  6. Java实现网络聊天程序的设计与实现(基于UDP协议)

    目录         TCP/IP协议介绍         Java中socket编程         测试结果 TCP/IP协议介绍         TCP/IP协议包含的范围非常的广,它是一种四层 ...

  7. Java实验:编写网络聊天程序(图形界面)

    课程名称 高级Java程序设计 实验项目 Java网络编程 实验目的: 使用客户机/服务器模式.基于TCP协议编写一对多"群聊"程序.其中客户机端单击"连接服务器&quo ...

  8. 基于Linux的网络编程——网络聊天程序

    网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux的网络编程的有效方法. 结合任务需求设计该程序,程序采用 ...

  9. [转载]VB网络聊天程序的开发(1)

    原文地址:VB网络聊天程序的开发(1)作者:VB源码博客 互联网已经成为现代社会生活中非常普及的一项事务.在互联网上可以查询信息.电子购物,还可以进行网络聊天.本博将从今天起,具体的计解一下利用VB开 ...

最新文章

  1. iOS通过CAShapeLayer和UIBezierPath画环形进度条
  2. 图像拼接--Coarse-to-fine Seam Estimation for Image Stitching
  3. 快速增强路由器安全的十个小技巧
  4. linux 查看发行版 名称 版本号
  5. 使用ITEXT操作PDF文件
  6. 《手机测试Robotium实战教程》——第2章,第2.2节Eclipse的安装
  7. java 访问器_网络之美 JavaScript中Get和Set访问器的实现代码
  8. PHP通过SMTP实现发送邮件_包括附件
  9. vue.js中的路由vue-router2.0使用
  10. Linux 3.2.8 内核启动过程
  11. jmeter实现手机号归属地接口测试案例
  12. Android开发之隐示意图跳转
  13. 通过修改window本地hosts文件修改域名指向
  14. 云防护当道,如何绕过云防护来进行渗透测试
  15. 项目导入阿里字体图标库
  16. 唐读笔记-正则表达式必知必会
  17. 【爱生活】人生箴言 一
  18. NSDNA:神经系统疾病相关的ncRNA数据库
  19. repo命令添加bin_Linux shell中getopts命令学习--实现一个添加yum源的脚本
  20. 直播app平台搭建需要那些技术流程

热门文章

  1. 微信PC端技术研究(2)-拿下语音
  2. NVME NSSR (Nvme Sub System Reset)
  3. antd走马灯组件自定义前进后退按钮
  4. jmeter录制手机脚本
  5. Centos 7 x64 英文版安装
  6. Android文件管理器
  7. rm -rf和rm -f和rm
  8. P01914100尹自杨
  9. (转)UEFI系统的启动过程
  10. 数学--数论--欧几里得定理和拓展欧几里得定理