计算机网络通信设计课程设计_第1页
计算机网络通信设计课程设计_第2页
计算机网络通信设计课程设计_第3页
计算机网络通信设计课程设计_第4页
计算机网络通信设计课程设计_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WindowsWindows 环境下环境下 TCP IPTCP IP 数据传输程序的基本运行步骤和编程方法数据传输程序的基本运行步骤和编程方法 在编此程序时 我们首先创造了一个支持 Windows Socket 功能的基类 在此基础上我 们又添加了一个继承的基类为 CSocket 的新类 CSocket 是 MFC 在 CAsyncSocket 基础上 派生的一个同步阻塞 Socket 的封装类 内支持 TCP IP 传输的 OnAccept OnReceive Onclose 等函数 因为在进行 TCP IP 通讯时 我们需要用到以上函 数调用 所以添加了此子类 void CFirstDlg OnNew if m nType 0 UpdateData TRUE BOOL bRet m Socket Create m nPortNumber if bRet MessageBox 创建连接失败 return MessageBox 创建连接成功 m Socket Listen else BOOL bRet m Socket Create UpdateData TRUE CString str unsigned char ipAdress1 ipAdress2 ipAdress3 ipAdress4 m IPAddress GetAddress ipAdress1 ipAdress2 ipAdress3 ipAdress4 str Format d d d d ipAdress1 ipAdress2 ipAdress3 ipAdress4 if m Socket Connect str m nPortNumber MessageBox 连接服务器失败 return MessageBox 连接服务器成功 CWnd pWnd GetDlgItem IDC New pWnd EnableWindow FALSE pWnd GetDlgItem IDC Link pWnd EnableWindow TRUE 首先 作为服务器首先要开放端口 而作为客户机而要呼叫相应端口建立连接 m nType 的值代表了程序作为客户机还是服务器 若 m nType 0 代表服务器 m nType 1 代表客户机 若为服务器则 m Socket Create m nPortNumber 利用 m nPortNumber 的端口号创建套接字 如果成功则调用 m Socket Listen 进行监听 若为 客户机则先调用 m Socket Create 创建一个套接字 然后调用 m Socket Connect str m nPortNumber 对相应的 ip 地址和端口号进行连接 void NewSocket OnAccept int nErrorCode TODO Add your specialized code here and or call the base class CSocket OnAccept nErrorCode NewSocket pSocket new NewSocket if Accept pSocket m pMyDlg m pNewSocket pSocket pSocket m pMyDlg m pMyDlg else delete pSocket 在客户机对服务器进行呼叫连接时 若服务器已处于监听状态 收到客户机连接请求 时 则产生消息调用 OnAccept OnAccept 中新定义一个 NewSocket 类 pSocket 指 针用来指向新建立的连接 并将地址赋予 m pNewSocket 用于接下来的处理 void CFirstDlg OnSendData NewSocket pSocket if m pNewSocket pSocket m pNewSocket else pSocket char Data 100 UpdateData TRUE strcpy Data m DataSend pSocket Send Data strlen Data 此时 服务器与客户机之间已经建立了 TCP IP 连接 接下来服务器或客户机就要向 对方发送数据 由于建立连接时使用的是 m Socket 变量 而在客户机呼叫服务器进行连接 时 服务器将 m pNewSocket 指针指向新建立的连接 而原服务器 m Socket 变量并没有指 向新的连接 而是仍然处于监听状态 因此 此时服务器新连接的 NewSocket 的指针为 m pNewSocket 客户机的新连接的 NewSocket 的指针为 m pMyDlg AccessDataRecieve this 在对方收到数据传输的要求后 就调用 NewSocket 的 OnReceive 函数进行数据接受 this 是指始终指向对象本身的指针 在这里如果是服务器则指 m pNewSocket 如果是客户 机则指 int nRet pSocket Receive Data 100 Data nRet 0 m ReceiveList AddString Data AccessDataRecieve 调用 NewSockey 中的 Receive 函数对所接收到的数据进行处理 并调用 m ReceiveList AddString 将接收到的数据显示在数据表单里 void CFirstDlg OnLink if m nType 0 m pNewSocket Close else m Socket Close m pNewSocket Close CWnd pWnd GetDlgItem IDC Link pWnd EnableWindow FALSE pWnd GetDlgItem IDC New pWnd EnableWindow TRUE 完成通讯后 若服务器客户机其中一方发起关闭连接的请求 则调用 OnLink 函数发 起主动关闭连接的请求 首先若 m nType 0 则说明主动关闭连接的是服务器 由于服务 器在整个通讯过程中使用的是 m pNewSocket 指针对 NewSocket 中函数进行调用 所以此 时依然使用的是 m pNewSocket 调用 close 进行关闭 同理 若为客户机则使用 m Socket 进行关闭 void NewSocket OnClose int nErrorCode CSocket OnClose nErrorCode m pMyDlg AccessClose void CFirstDlg AccessClose m pNewSocket Close delete m pNewSocket m pNewSocket NULL CWnd pWnd GetDlgItem IDC Link pWnd EnableWindow FALSE pWnd GetDlgItem IDC New pWnd EnableWindow TRUE 当某一方主动发起关闭连接请求时 另外一方也会通过 NewSocket 的虚函数 OnClose 接 收到被动关闭连接的请求 然后指向 CfirstDlg 的 m pMyDlg 的指针调用 AccessClose 函数 进行连接的被动关闭 然而 AccessClose 中只对 m pNewSocket 的指针进行了 Close 的调 用 然后删除 m pNewSocket 并将 m pNewSocket 指向空地址 并没有对 m Socket 进行操 作 简而言之这里的程序默认服务器是不能主动发起关闭连接的请求的 所以对程序修改 如下 使得服务器也能主动发起关闭链接的请求 void CFirstDlg AccessClose if m nType 0 m pNewSocket Close delete m pNewSocket m pNewSocket NULL else m Socket Close CWnd pWnd GetDlgItem IDC Link pWnd EnableWindow FALSE pWnd GetDlgItem IDC New pWnd EnableWindow TRUE 此时 服务器也能主动发起关闭链接的请求 其他资料 其他资料 SocketSocket 与与 TCP IPTCP IP 协议之间的关系协议之间的关系 编程实现的编程实现的 SocketSocket 通讯框图通讯框图 利用利用 javajava 实现的实现的 SocketSocket 通讯步骤通讯步骤 例举最简单的客户端写服务端读的例子 服务端 1 首先定义一个 ServerSocket 监听在你自己设置的端口上 2 server 尝试接收其他 Socket 的连接请求 3 跟客户端建立好连接之后 我们就可以获取 socket 的 InputStream 并从中读取客户端发过来的信息 客户端 1 定义要连接的服务端 IP 地址 2 定义要连接的服务端对应的监听端口 3 与服务端建立连接 4 建立连接后可以向服务端写数据 程序示例 程序示例 服务器端 1 public class Server 2 3 public static void main String args throws IOException 4 int port 8899 5 ServerSocket server new ServerSocket port 6 Socket socket server accept 7 Reader reader new InputStreamReader socket getInputStream 8 char chars new char 64 9 int len 10 StringBuilder sb new StringBuilder 11 while len reader read chars 1 12 sb append new String chars 0 len 13 14 System out println from client sb 15 Writer writer new OutputStreamWriter socket getOutputStream 16 writer write Hello Client 17 writer flush 18 writer close 19 reader close 20 socket close 21 server close 22 23 客户机端 1 public class Client 2 public static void main String args throws Exception 3 String host 127 0 0 1 4 int port 8899 5 Socket client new Socket host port 6 Writer writer new OutputStreamWriter client getOutputStream 7 writer write Hello Server 8 writer flush 9 Reader reader new InputStreamReader client getInputStream 10 char chars new char 64 11 int len 12 StringBuffer sb new StringBuffer 13 while len reader read chars 1 14 sb append new String chars 0 len 15 16 System out println from server sb 17 writer close 18 reader close 19 client close 20 21 利用利用 linuxlinux 实现的实现的 SocketSocket 通讯步骤通讯步骤 服务端 1 类似的 首先定义一个套接字描述符 sockfd 2 定义服务器网络地址结构体 sockaddr in 3 创建服务器端套接字 IPv4 协议 面向连接通信 TCP 协议 4 将套接字绑定到服务器的网络地址上 5 建立监听等待客户端连接请求到达 6 接收客户端的数据并将其发送给服务器端 客户端 1 首先定义一个套接字描述符 sockfd 2 定义服务器网络地址结构体 sockaddr in 3 创建客户端套接字 IPv4 协议 面向连接通信 TCP 协议 4 将套接字绑定到服务器的网络地址上 5 向服务器发起呼叫连接请求 6 循环的发送接收信息并打印接收信息 程序示例 程序示例 服务器端 include include include include include include int main int sfp nfp struct sockaddr in s add c add int sin size unsigned short portnum 0 x8888 printf Hello welcome to my server r n sfp socket AF INET SOCK STREAM 0 if 1 sfp printf socket fail r n return 1 printf socket ok r n bzero s add sin family AF INET s add sin addr s addr htonl INADDR ANY s add sin port htons portnum if 1 bind sfp struct sockaddr return 1 printf bind ok r n if 1 listen sfp 5 printf listen fail r n return 1 printf listen ok r n while 1 sin size sizeof struct sockaddr in nfp accept sfp struct sockaddr if 1 nfp printf accept fail r n return 1 printf accept ok r nServer start get connect from x x r n ntohl c add sin addr s addr n tohs c add sin port if 1 write nfp hello welcome to my server r n 32 printf write fail r n return 1 printf write ok r n close nfp close sfp return 0 客户机端 include include include include include include int main int cfd int recbytes int sin size char buffer 1024 0 struct sockaddr in s add c add unsigned short portnum 0 x8888 printf Hello welcome to client r n cfd socket AF INET SOCK STREAM 0 if 1 cfd printf socket fail r n return 1 printf socket ok r n bzero s add sin family AF INET s add sin addr s addr inet addr 192 168 1 2 s add sin port htons portnum printf s addr x port x r n s add sin addr s addr s add sin port if 1 connect cfd struct sockaddr return 1 printf connect ok r n if 1 recbytes read cfd buffer 1024 printf read data fail r n return 1 printf read ok r nREC r n buffer recbytes 0 printf s r n buffer getchar close cfd return 0 利用利用 phpphp 实现的实现的 SocketSocket 通讯步骤通讯步骤 1 第一步是建立两个变量来保存 Socket 运行的服务器的 IP 地址和口 你可以配置为你自己的服务器和端口 2 调用 socket create 函数建立一个 Socket 3 绑定 socket to 指定地址和端口 4 当 Socket 被建立好并绑定到一个端口就可以开始监听外部的连接 5 等待客户端连接请求到达 6 当一个连接被建立后 服务器就会等待客户端发送一些输入信息 程序示例 程序示例 1 配置一些基本的变量 2 3 host 192 168 1 99 4 5 port 1234 6 7 配置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论