设为首页 - 加入收藏 北海站长网 (http://www.0779zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 1 浅谈 tomcat 图片
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

从TCP到Socket,彻底理解网络编程是怎么回事

发布时间:2019-02-24 07:11 所属栏目:[教程] 来源:itworld123
导读:进行程序开发的同学,无论Web前端开发、Web后端开发,还是搜索引擎和大数据,几乎所有的开发领域都会涉及到网络编程。比如我们进行Web服务端开发,除了Web协议本身依赖网络外,通常还需要连接数据库,而数据库连接通常是通过网络连接数据库服务器,或者数

进行程序开发的同学,无论Web前端开发、Web后端开发,还是搜索引擎和大数据,几乎所有的开发领域都会涉及到网络编程。比如我们进行Web服务端开发,除了Web协议本身依赖网络外,通常还需要连接数据库,而数据库连接通常是通过网络连接数据库服务器,或者数据库集群,如果负载太高还要搞个缓存集群。

从TCP到Socket,彻底理解网络编程是怎么回事

我们在上学的时候基本学了网络编程和网络协议。但两者之间的具体关系可能有些摸不到头脑。这里我们首先重点介绍2个概念,一个概念是网络编程,另外一个是协议。

我们知道网络协议是一个分层的协议族,也就是是有一组协议构成,从下往上各自负责各自的功能。那什么是协议呢?协议的字面意思是共同计议,商议。简单的理解其实就是多方进行沟通的规定。而网络协议其实就是在网络中多个计算节点进行交互、沟通的规定。如果根我们日常生活对比的话,协议可以理解为语言,比如汉语普通话。两个人交流如果都用不通话,那么彼此都能理解对方表达的意图。例如,一个人用四川话,而另外一个用浙江话,那沟通起来估计几乎不太可能。网络协议也是一样的,通过对数据格式的规范化,从而使计算机之间能够彼此明确对方的意图。

下面本文介绍一下网络编程,网络编程也称为socket编程,socket通常译作“套接字”,但原意其实意译应该为”接口“。也就是操作系统提供给开发人员进行网络开发的API接口。这套接口通常可以参数的调整支持多种协议,包括TCP、UDP和IP等等。下面本文从套接字编程和协议两方面分别详细的进行介绍。

网络编程

为了便于理解,本文先从具体的内容开始,也就是通过一个实例介绍一下网络编程是怎么回事。

本文将以TCP协议为例介绍网络编程和协议之前的关系。为了简单,便于理解,本文以Python为例进行介绍,如果不了解Python编程语言关系也不大,下面代码很容易理解。我们知道在网络通信中无论是BS架构还是CS架构,通常分为服务端和客户端,只不过BS架构中的浏览器就是客户端。因此,本文的示例也包含服务端和客户端2部分的代码。代码功能很简单,就是实现客户端和服务端发送字符串。

图1 客户端服务端通信模型

这个代码清单是服务端的代码,这段代码的作用就是在服务端的某个端口建立监听,并等待客户端建立连接。完成连接建立后,等待客户端发送数据,并将数据回传给客户端。

  1. #!/usr/bin/env?python3?
  2. #-*-?coding:utf-8?-*-?
  3. from?socket?import?*?
  4. from?time?import?ctime?
  5. host?=?''?
  6. port?=?12345?
  7. buffsize?=?2048?
  8. ADDR?=?(host,port)?
  9. #?创建一个基于TCP协议的套接字?
  10. tctime?=?socket(AF_INET,SOCK_STREAM)?
  11. tctime.bind(ADDR)?
  12. #?在指定的地址和端口监听?
  13. tctime.listen(3)?
  14. while?True:?
  15. ?print('Wait?for?connection?...')?
  16. ?tctimeClient,addr?=?tctime.accept()?
  17. ?print("Connection?from?:",addr)?
  18. ?while?True:?
  19. ?data?=?tctimeClient.recv(buffsize).decode()?
  20. ?if?not?data:?
  21. ?break?
  22. ?tctimeClient.send(('[%s]?%s'?%?(ctime(),data)).encode())?
  23. ?tctimeClient.close()?
  24. tctimeClient.close()?

阅读服务端的代码可以看出主要包括,socket、bind、listen、accept、recv和send几个。其中值得关注的是listen和accept,两者分别用于监听端口和接受客户端的连接请求。

下面代码清单是客户端的实现,这里特别的地方是有一个connect函数,该函数实现与服务端建立连接。

  1. #!/usr/bin/env?python3?
  2. #-*-?coding:utf-8?-*-?
  3. from?socket?import?*?
  4. HOST?='localhost'?
  5. PORT?=?12345?
  6. BUFFSIZE=2048?
  7. ADDR?=?(HOST,PORT)?
  8. tctimeClient?=?socket(AF_INET,SOCK_STREAM)?
  9. tctimeClient.connect(ADDR)?
  10. while?True:?
  11. ?data?=?input(">")?
  12. ?if?not?data:?
  13. ?break?
  14. ?tctimeClient.send(data.encode())?
  15. ?data?=?tctimeClient.recv(BUFFSIZE).decode()?
  16. ?if?not?data:?
  17. ?break?
  18. ?print(data)?
  19. tctimeClient.close()?

通过上述示例代码可以看出服务端通常是被动的,而客户端则要主动一些。服务端程序建立对某个端口的监听,等待客户端的连接请求。客户端向服务端发送连接请求,不出意外的情况下连接建立成功,这时客户端和服务端之前就可以互发数据了。当然,在实际生产环境中意外是经常的,因此从协议和接口层面,需要处理各种意外,本文在协议部分将详细介绍。

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章