使用socket进行通信程序设计
- 格式:docx
- 大小:1.63 MB
- 文档页数:40
socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它可以在不同的计算机之间实现数据的传输和通信。
本次实验旨在通过Socket编程实现一个简单的客户端和服务器端通信,并对其进行测试和分析。
实验环境:- 操作系统:Windows 10- 开发工具:Visual Studio Code- 编程语言:Python实验步骤:1. 设计客户端和服务器端的通信协议2. 编写客户端和服务器端的代码3. 运行客户端和服务器端,并进行通信测试4. 分析通信过程中的数据传输情况实验结果:经过实验,我们成功实现了一个简单的客户端和服务器端通信程序。
在测试过程中,我们发现数据可以正常地在客户端和服务器端之间传输,而且通信过程稳定可靠。
分析:通过本次实验,我们深入了解了Socket编程的基本原理和实现方式。
Socket编程可以灵活地实现不同计算机之间的通信,为网络通信提供了重要的技术支持。
在实际应用中,Socket编程可以用于实现各种网络通信功能,如网页浏览、文件传输、视频流等。
总结:通过本次实验,我们对Socket编程有了更深入的了解,并掌握了基本的编程技巧和调试方法。
Socket编程是网络通信中的重要技术,对于计算机网络领域的学习和应用具有重要的意义。
希望通过今后的实践和学习,我们能够进一步深化对Socket编程的理解,为网络通信技术的发展做出贡献。
通过本次实验,我们对Socket编程有了更深入的了解,并掌握了基本的编程技巧和调试方法。
Socket编程是网络通信中的重要技术,对于计算机网络领域的学习和应用具有重要的意义。
希望通过今后的实践和学习,我们能够进一步深化对Socket编程的理解,为网络通信技术的发展做出贡献。
目录摘要 (1)1 前言 (1)2 可行性研究 (2)2.1开发背景 (2)2.2技术可行性分析 (2)2.3面临问题及现状 (2)2.4开发目的及意义 (3)2.5.1运行环境 (3)2.5.2性能要求 (3)3 需求分析 (3)3.1系统总体功能 (3)3.2开发工具以及使用的主要技术简介 (4)3.2.1数据库Microsoft SQL2000简介 (5)3.2.2 eclipse简介 (6)3.3客户机/服务期(C/S)工作原理 (7)3.4套接字(SOCKET)原理图 (8)3.5系统逻辑模式 (8)3 概要设计 (9)3.1客户端 (10)3.1.1 用户注册功能模块 (10)3.1.2发送消息功能模块 (11)3.1.3查找好友功能模块 (11)3.1.4 添加好友模块 (11)3.1.5删除好友模块 (12)3.1.6修改个人信息模块 (12)3.2服务器 (12)3.2.1用户登录模块设计 (13)3.2.2新用户注册模块设计 (14)3.2.3查找网友模块设计 (15)3.2.4添加好友模块设计 (16)3.2.5 用户之间发送数据模块设计 (17)3.3数据库设计 (18)3.3.1数据库结构设计 (19)3.3.2数据表设计 (19)3.3.3 数据字典 (21)(1) 聊天信息字典 (21)4 详细设计 (22)4.1服务器端 (22)4.1.1服务器建立和启动模块 (22)4.1.2 数据库交互模块 (23)4.1.3 处理客户端请求模块 (25)4.1.4 异常处理模块 (25)4.2客户端 (25)4.2.1 客户端与服务器建立连接模块 (25)4.2.2 用户登陆模块 (26)4.2.3 注册模块 (26)4.2.4 通讯模块 (27)4.2.5 聊天模块 (28)4.2.6 查找好友模块 (29)4.2.7个人信息模块 (30)5 总结 (32)参考文献 (33)致谢........................................... 错误!未定义书签。
《VS2010-MFC课程设计》报告基于TCP的C/S设计专业:计算机科学与技术班级:计算机11303姓名:游承峰学号:1304240122指导教师:杜小勤服务器的建立1.创建一个MFC项目,修改名称为MyyouchengfengServer以及存放路径2.应用程序类型选择基于对话框3.项目配置,在向导过程中选择“基于对话框”模式,并选择“windows”套接字。
4.设计服务器界面,控件有:5个静态文本(Static Text),最后一个用于指示用户连接个数;2个按钮(Button),一个用于打开或关闭服务器,一个发送聊天内容;4个编辑框(Edit Control),一个用于输入端口号,一个只读的用于显示事件日志,另一个用于输入聊天内容。
5.编辑框2和3还要把Multiline和Vertical Scroll属性选为true,以实现多行显示并自带滚动条6.双击两个按钮自动生成函数,后面添加相关代码即可7.在类视图中添加一个新的MFC类CMyyouchengfengSocket,派生于CSocket类,8.对该类进行类向导添加三个重写的虚函数:OnAccept()、OnClose()、OnReceive() 9.修改CMyyouchengfengSocket.h#pragma once// CMyyouchengfengSocket 命令目标#include "MyyouchengfengServerDlg.h"classCMyyouchengfengServerDlg;classCMyyouchengfengSocket : public CSocket{public:CMyyouchengfengServerDlg* m_pDlg;CMyyouchengfengSocket();virtual ~CMyyouchengfengSocket();virtual void OnAccept(intnErrorCode);virtual void OnClose(intnErrorCode);virtual void OnReceive(intnErrorCode);};10.修改源文件CMyyouchengfengSocket.cppvoidCMyyouchengfengSocket::OnAccept(intnErrorCode){// TODO: 在此添加专用代码和/或调用基类m_pDlg->AddClient(); //添加上线用户CSocket::OnAccept(nErrorCode);}voidCMyyouchengfengSocket::OnClose(intnErrorCode){// TODO: 在此添加专用代码和/或调用基类m_pDlg->RemoveClient(this); // 删除下线用户CSocket::OnClose(nErrorCode);}voidCMyyouchengfengSocket::OnReceive(intnErrorCode){// TODO: 在此添加专用代码和/或调用基类m_pDlg->RecvData(this); // 接收数据CSocket::OnReceive(nErrorCode);}11.修改头文件MyyouchengfengServerDlg.h开头加上#include"MyyouchengfengSocket.h"class CMyyouchengfengSocket;12. 添加函数声明和变量定义CMyyouchengfengSocket* listenSocket; // 用于打开服务器CPtrListm_clientList; //链表用于存储用户boolm_connect; //用于标记服务器状态void AddClient(); //增加用户,响应用户请求void RemoveClient(CMyyouchengfengSocket* pSocket); //移除下线的用户void RecvData(CMyyouchengfengSocket* pSocket); //获取数据void UpdateEvent(CStringstr); //更新事件日志virtual BOOL PreTranslateMessage(MSG* pMsg); //防止ESC键意外退出void UpdateChatRecord(CStringstr); // 更新聊天记录13. 修改CMyyouchengfengServerDlg.cpp中实现的函数voidCMyyouchengfengServerDlg::OnBnClickedStartserver(){// TODO: 在此添加控件通知处理程序代码if (m_connect){deletelistenSocket;listenSocket = NULL;m_connect = false;SetDlgItemText(IDC_StartServer, _T("打开服务器"));UpdateEvent(_T("系统关闭服务器."));return;}listenSocket = new CMyyouchengfengSocket();listenSocket->m_pDlg = this;UpdateData(true);if (!listenSocket->Create(m_Port)){AfxMessageBox(_T("创建套接字错误!"));listenSocket->Close();return;}if (!listenSocket->Listen()){AfxMessageBox(_T("监听失败!"));listenSocket->Close();return;}m_connect = true;SetDlgItemText(IDC_StartServer, _T("关闭服务器"));UpdateEvent(_T("系统打开服务器."));}本函数用于打开或关闭服务器,主要用到Create函数和Listen函数用于创建服务器和监听客户端。
C语⾔实现socket简单通信实例本⽂实例讲述了C语⾔实现socket简单通信的⽅法,分享给⼤家供⼤家参考。
具体实现⽅法如下:服务器端代码如下:/*============================================================================Name : server.cAuthor : kingVersion :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================*/#include <stdlib.h>#include <pthread.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h> /* inet(3) functions */#include <stdlib.h>#include <errno.h>#include <stdio.h>#include <string.h>int handle(int point);int main(void) {int sfd, ind;struct sockaddr_in addr;struct sockaddr_in clent;char resv[1024], sendbuf[1024];char buf[1024];char * myaddr = "192.168.231.128";int ret; // 返回值设置socklen_t lent;int pid;addr.sin_family = AF_INET; //IPv4 Internet protocolsaddr.sin_port = htons(5050); //这⾥输⼊服务器端⼝号addr.sin_addr.s_addr = inet_addr(myaddr);; //INADDR_ANY表⽰本机IP//獲取socket描述符,IPV4asdprintf("socket start \n");sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd < 0) {printf("socket error \n");return -1;}printf("bind start \n");//将套接⼦与指定端⼝链接if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) < 0) {printf("bind error \n");return -1;}//监听套接⼦printf("listen start \n");if (listen(sfd, 1024) < 0) {printf("listen error \n");return -1;}for (;;) {//接受来⾃客户端的信息printf("accept start \n");memset(&clent, 0, sizeof(clent));lent = sizeof(clent);ind = accept(sfd, (struct sockaddr *) &clent, &lent);if (ind < 0) {printf("accept error %d \n", ind);return -1;}printf("infor \n");printf("clent addr%s porit %d\n",inet_ntop(AF_INET, &clent.sin_addr, buf, sizeof(buf)),ntohs(clent.sin_port));pid = fork();if (pid == 0) {//⼦进程close(sfd);handle(ind);} else if (pid < 0) {//errorclose(ind);} else {//⽗进程}}return EXIT_SUCCESS;}int handle(int point) {int retn;char buf[1024];for (;;) {retn = read(point, buf, sizeof(buf));if (retn < 0) {printf("read error \n");close(point);break;} else if (retn == 0) {printf("client exit \n");close(point);break;}printf("client:%s\n", buf);if (strcmp("exit", buf) == 0) {printf("exit \n");close(point);return 0;}}return 0;}客户端代码如下:/*============================================================================ Name : client.cAuthor : kingVersion :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================ */#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> /* inet(3) functions */int handle(int fd);int main(void) {int nsd;char buf[1024];char * myaddr = "192.168.231.128";struct sockaddr_in addr;printf("welcome to echo client\n");nsd = socket(AF_INET, SOCK_STREAM, 0);printf("connect start1 \n");//bzero(addr, sizeof(*addr));memset(&addr,0,sizeof(addr));printf("connect start2 \n");addr.sin_family = AF_INET;addr.sin_port = htons(5050);addr.sin_addr.s_addr=inet_addr(myaddr);printf("connect start3 \n");if (connect(nsd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) {printf("connect error \n");return -1;}sleep(5);printf("handle start\n");handle(nsd);close(nsd);return EXIT_SUCCESS;}int handle(int fd) {char sendl[1024], rev[1024];int retn;for (;;) {memset(sendl,0,sizeof(sendl));memset(rev,0,sizeof(rev));if (fgets(sendl, 1024, stdin) == NULL) {break;}//printf("wirte start\n");write(fd, sendl, strlen(sendl));read(fd, rev,strlen(rev));}return 0;}注意:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);记住⼀定是值 addrlenaccept socklen_t *addrlen要是⼀个指针希望本⽂所述对⼤家C语⾔⽹络程序设计的学习有所帮助。
利用Delphi编写Socket通信程序一、前言随着计算机技术的不断发展,网络应用得到了越来越广泛的应用,而Socket编程作为网络编程中最基础、最重要的部分,具有非常重要的意义。
Delphi是一种构建Windows应用程序的高级集成开发工具,支持对象化设计、事件驱动、可视化编程等多种编程方式。
Delphi具有非常强大的GUI设计、数据访问、组件开发等特点,可以方便地应用到Socket编程中,实现Socket通信程序的开发。
本文就介绍利用Delphi编写Socket通信程序相关的知识。
二、Socket编程基础Socket是一种用于网络通信的编程接口,它把网络通信抽象成发送和接收数据的过程。
Socket编程分为客户端和服务器两部分,客户端负责向服务器发起连接请求,服务器则负责接收客户端的连接请求,并根据请求提供相应的服务。
Socket编程中,通常使用TCP/IP协议进行数据传输。
TCP协议是一种可靠的、面向连接的协议,它通过三次握手建立连接,保证数据的可靠性、完整性和顺序性。
而UDP协议则是一种不可靠的、无连接的协议,它不保证数据的可靠性和完整性,但具有数据传递速度快等特点。
通常,TCP协议适用于对数据可靠性要求较高的应用场景,如文件传输、邮件系统、即时通信等;而UDP协议适用于对数据传输速度要求较高的应用场景,如视频直播、网络游戏等。
三、利用Delphi编写Socket通信程序1. 创建Socket使用Delphi进行Socket编程,可通过TServerSocket和TClientSocket组件来实现。
TServerSocket组件用于创建服务器Socket,TClientSocket组件用于创建客户端Socket。
在Delphi中,可以通过在组件面板中拖拽TServerSocket或TClientSocket组件来创建Socket。
使用TServerSocket组件创建服务器Socket的示例代码如下:```delphiprocedure TMyForm.FormCreate(Sender: TObject);begin ServerSocket1.Port := 8888;ServerSocket1.Active := True;end;procedure TMyForm.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);beginMemo1.Lines.Add(Socket.RemoteAddress + ' connected.');end;```上述代码中,将ServerSocket1的Port属性设置为8888,表示该服务器监听8888端口的连接请求。
实验七 Socket网络编程一、学时:4二、实验类型:设计性实验三、实验目的:1.熟悉VisualC++的基本操作。
2.基本了解基于对话框的windows应用程序的编写过程。
3.对于Windows Socket编程建立初步概念。
四、实验内容:利用Socket编写聊天程序。
五、实验原理:一、Windows Socket和套接口的基本概念套接口,就是一个指向传输提供者的句柄。
Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。
Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的 A PI实现Windows 式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。
Windows在Internet支配域中的TCP/IP协议定义了Winsock网络编程规范,融入了许多新特点。
使用Socket的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。
此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。
Winsock提供了一种可为指定传输协议打开、计算和关闭会话的能力。
在Windows下,TCP/IP上层模型在很大程度上与用户的Winsock应用有关;换言之,用户的Winsock应用控制了会话的方方面面,必要时,还会根据程序的需要格式化数据。
套接口有三种类型:流式套接口、数据报套接口及原始套接口。
流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。
数据报套接口定义了一种无连接的服务(UDP 协议),数据通过相互独立的报文进行传输,是无序的,并且不保证可靠和无差错。
C语⾔socket编程----实现UDP通信TCP/IP协议叫做传输控制/⽹际协议,⼜叫做⽹络通信协议。
实际上,它包括上百个功能的协议。
套接字(socket):在⽹络中⽤来描述计算机中不同程序与其他计算程序的通信⽅式。
套接字分为三类;流式socket(SOCK_STREAM):提供可靠,⾯向连接的通信流;它使⽤TCP协议,从⽽保证了数据传输的正确性和顺序性。
数据报socket(SOCK_DGRAM):数据报套接字定义了⼀种⽆连接的服务,数据通过相互独⽴的报⽂进⾏传输,⽆序的,并且不保证可靠,⽆差错的。
它使⽤的数据报协议是UDP。
原始socket:原始套接字允许对底层协议如TP或ICMP进⾏直接访问,它功能强⼤但使⽤复杂,主要⽤于⼀些协议的开发。
下⾯是UDP通信的demo://socket udp 服务端1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 #include<sys/socket.h>5 #include<arpa/inet.h>67int main()8 {9//创建socket对象10int sockfd=socket(AF_INET,SOCK_DGRAM,0);1112//创建⽹络通信对象13struct sockaddr_in addr;14 addr.sin_family =AF_INET;15 addr.sin_port =htons(1324);16 addr.sin_addr.s_addr=inet_addr("127.0.0.1");1718//绑定socket对象与通信链接19int ret =bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));20if(0>ret)21 {22 printf("bind\n");23return -1;2425 }26struct sockaddr_in cli;27 socklen_t len=sizeof(cli);2829while(1)30 {31char buf =0;32 recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,&len);33 printf("recv num =%hhd\n",buf);3435 buf =66;36 sendto(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,len);3738 }39 close(sockfd);4041 }//socket udp 客户端1 #include<stdio.h>2 #include<sys/types.h>3 #include<sys/socket.h>4 #include<unistd.h>5 #include<arpa/inet.h>67int main()8 {9//创建socket对象10int sockfd=socket(AF_INET,SOCK_DGRAM,0);1112//创建⽹络通信对象13struct sockaddr_in addr;14 addr.sin_family =AF_INET;15 addr.sin_port =htons(1324);16 addr.sin_addr.s_addr = inet_addr("192.168.0.143");1718while(1)19 {20 printf("请输⼊⼀个数字:");21char buf=0;22 scanf("%hhd",&buf);23 sendto(sockfd,&buf,24sizeof(buf),0,(struct sockaddr*)&addr,sizeof(addr));2526 socklen_t len=sizeof(addr);27 recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&addr,&len); 2829if(66 ==buf)30 {31 printf(" server 成功接受\n");32 }33else34 {35 printf("server 数据丢失\n");36 }3738 }39 close(sockfd);4041 }。
socket编程——⼀个简单的例⼦1、⽹络中进程之间如何通信?本地的进程间通信(IPC)有很多种⽅式,但可以总结为下⾯4类:消息传递(管道、FIFO、消息队列)同步(互斥量、条件变量、读写锁、⽂件和写记录锁、信号量)共享内存(匿名的和具名的)远程过程调⽤(Solaris门和Sun RPC)但这些都不是本⽂的主题!我们要讨论的是⽹络中进程之间如何通信?⾸要解决的问题是如何唯⼀标识⼀个进程,否则通信⽆从谈起!在本地可以通过进程PID来唯⼀标识⼀个进程,但是在⽹络中这是⾏不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,⽹络层的“ip地址”可以唯⼀标识⽹络中的主机,⽽传输层的“协议+端⼝”可以唯⼀标识主机中的应⽤程序(进程)。
这样利⽤三元组(ip地址,协议,端⼝)就可以标识⽹络的进程了,⽹络中的进程通信就可以利⽤这个标志与其它进程进⾏交互。
使⽤TCP/IP协议的应⽤程序通常采⽤应⽤编程接⼝:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现⽹络进程之间的通信。
就⽬前⽽⾔,⼏乎所有的应⽤程序都是采⽤socket,⽽现在⼜是⽹络时代,⽹络中进程通信是⽆处不在,这就是我为什么说“⼀切皆socket”。
2、什么是Socket?上⾯我们已经知道⽹络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,⽽Unix/Linux基本哲学之⼀就是“⼀切皆⽂件”,都可以⽤“打开open –> 读写write/read –> 关闭close”模式来操作。
我的理解就是Socket就是该模式的⼀个实现,socket即是⼀种特殊的⽂件,⼀些socket函数就是对其进⾏的操作(读/写IO、打开、关闭),这些函数我们在后⾯进⾏介绍。
socket⼀词的起源在组⽹领域的⾸次使⽤是在1970年2⽉12⽇发布的⽂献中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。
使用socket进行通信程序设计姓名:学号:专业:2015年10月30日引言:“一切皆Socket!”。
这话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。
当前是信息时代,网络的快速普及势不可挡,各种新兴应用也如雨后春笋般,层出不穷。
利用socket通信拥有即时通信功能的网络应用——聊天室,也因其为用户提供了实时性对话的渠道,深受青睐。
在本课程设计中,我个人选择C#语言实现了一个界面友好的网络聊天室,包括服务器端和客户端两个程序,可以支持多人进行文字聊天。
基本原理:1、客户机/服务器模式在TCP/IP网络中两个进程间相互作用的主机模式是客户机/服务器模式(Client/Server model)。
该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)①打开一个通信通道(端口)并告知本地主机,并在某一个公认地址上接收客户请求;②等待客户请求到达该端口;③接收到重复服务请求,处理该请求并发送应答信号;④返回第二步,等待另一客户请求;⑤关闭服务器。
客户方:①打开一个通信通道,并连接到服务器所在主机的特定端口;②向服务器发送服务请求报文,等待并接收应答;继续提出请求……③请求结束后关闭通信通道并终止。
2、套接字套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。
套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。
套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。
各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
套接字可以根据通信性质分类,这种性质对于用户是可见的。
应用程序一般仅在同一类的套接字间进行通信。
不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。
套接字有两种不同的类型:流套接字和数据报套接字。
套接字工作原理:要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
3、C# Socket在C#中提供了两种网络服务,一种是Socket类,另一种是TcpListener (服务器),TcpClient(客户端);Socket 类为网络通信提供了一套丰富的方法和属性。
Socket 类允许您使用ProtocolType枚举中所列出的任何一种协议执行异步和同步数据传输。
Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间和.Sockets 包含丰富的类可以开发多种网络应用程序。
.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。
抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net 类可以视为包含3个层次:请求/响应层、应用协议层、传输层。
WebReqeust 和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。
传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。
而在.Net中,.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。
命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。
其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。
可见,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom 方法接收来自连接Socket的数据;针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。
其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。
使用socket其间用到的方法/函数有:Socket.Connect方法:建立到远程设备的连接public void Connect(EndPoint remoteEP)(有重载方法)Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的Socket。
public int Send(byte[], int, SocketFlags);(有重载方法)Socket.SendTo 方法将数据发送到特定终结点。
public int SendTo(byte[], EndPoint);(有重载方法)Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。
public int Receive(byte[],int,SocketFlags);Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。
public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint);Socket.Bind 方法:使 Socket 与一个本地终结点相关联:public void Bind( EndPoint localEP );Socket.Listen方法:将 Socket 置于侦听状态。
public void Listen( int backlog );Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。
public Socket Accept();Socket.Shutdown方法:禁用某 Socket 上的发送和接收public void Shutdown( SocketShutdown how );Socket.Close方法:强制 Socket 连接关闭public void Close();TcpClient 类基于 Socket 类构建,这是它能够以更高的抽象程度提供TCP 服务的基础。
因此许多应用层上的通讯协议,比如FTP(File Transfers Protocol)文件传输协议、HTTP(Hypertext Transfers Protocol)超文本传输协议等都直接创建在TcpClient等类之上。
TcpClient类,TcpListener类提供了一些简单的方法,用于在各模式下通过网络来连接、发送和接收流数据。
为使TcpClient连接并交换数据,使用TCP ProtocolType创建的TcpListener或Socket必须侦听是否有传入的连接请求。
可以使用下面两种方法之一连接到该侦听器:(1)创建一个TcpClient,并调用三个可用的Connect方法之一。
(2)使用远程主机的主机名和端口号创建TcpClient。
此构造函数将自动尝试一个连接。
TcpClient和TcpListener使用NetworkStream类表示网络。
使用GetStream方法返回网络流,然后调用该流的Read和Write方法。
NetworkStream不拥有协议类的基础套接字,因此关闭它并不影响套接字。
TCPClient 类使用 TCP 从 Internet 资源请求数据。
TCP 协议建立与远程终结点的连接,然后使用此连接发送和接收数据包。
TCP 负责确保将数据包发送到终结点并在数据包到达时以正确的顺序对其进行组合。
从名字上就可以看出,TcpClient类专为客户端设计,它为 TCP 网络服务提供客户端连接。
TcpClient提供了通过网络连接、发送和接收数据的简单方法。
基于以上,本次实验中我使用了TcpClient类和TcpListener。
主要数据结构:主程序分成两部分,在服务器端由于要实现多用户通信,所以建立一个Client类用于存放各个连接服务器端客户的信息。
该类的主要结构如下:class Client{public TcpClient client { get; private set; }public BinaryReader br { get; private set; }public BinaryWriter bw { get; private set; }public string clientName { get; set; }public Client(TcpClient client){}public void Close(){}}其余程序部分没有特别需要说明的数据结构,都是有关于socket通信的,在上面部分已经详述,在这里不作赘述。