加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

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

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

进行程序开发的同学,无论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() 

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

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读