一、Socket简介

1、不同电脑上的进程如何通信?

  进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的!

  在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台电脑的IP可能都是不一样的,因此TCP/IP协议族通过使用IP地址+端口号的方式来标识任意一台主机的应用进程。

  因此,利用IP地址 + 协议 + 端口号就可以用来标识网络进程了,网络中可以利用这个标识来与其他进程通信。

2.什么是socket

  Socket简称为套接字,是进程间通信的一种方式,它与其他进程间通信的一个不同之处在于:它能实现不同主机间的进程间通信,网络上各种各样的服务大多是基于Socket来完成的。

二、TCP简介

  1.介绍:TCP协议,传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

  2.通信流程:建立连接、数据传输、终止连接,就类似我们生活中的“打电话”。

三、TCP特点:

   1.面向连接:通信前必须先建立连接才能进行数据传输,双方都必须为该连接分配必要的系统内核资源。

   2.可靠传输:主要体现在:

     1). TCP采用发送应答机制:TCP发送的每个报文都必须得到接收方的应答才能成功传输该报文。

     2). 超时重传:如果发出的报文在一段时间内没有收到应答那么就重新发送这个报文段。此外,TCP是为每个包都分配一个序号,用来保证不会发送方丢包和用于在接收端重组。

     3). 错误检验:TCP用一个校验和函数来校验数据是否有误,

       4). 流量控制和阻塞管理:用来避免主机发送得过快而使接收方来不及全部收下。

四、UDP协议

  UDP是一中无需建立连接就能通信的协议,只需要发送数据即可。因此一般适用于广播的应用程序。

五、TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

六、TCP/IP协议族

  互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,因此一般把互联网的协议简称为TCP/IP协议族。

七、TCP/IP协议传输示意图

  以QQ间发送消息为例!

  

八、TCP通信模型

  主要是使用TCP协议来进行通信!

  

  

  注意点:

  1. tcp服务器一般情况下都需要绑定端口,否则客户端找不到这个服务器
  2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
  4. 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
  5. 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
  6. listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

代码实现如:

 1 import socket
 2
 3
 4 def main():
 5     pass
 6     # 1.创建TCP套接字
 7     tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 8     # 设置地址可重用
 9     tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
10     # 2.把套接字绑定到主机上
11     tcp_sock.bind(('', 6060))
12     # 3.被动套接字
13     tcp_sock.listen(128)
14     print('{}正在监听中'.format(tcp_sock.getsockname()))
15     # 4.与客户端进行连接
16     while True:
17         client, addr = tcp_sock.accept() # Ctrl+Shift +i
18         print('已经连接到了客户端:{}'.format(addr))
19         # 接收来自客户端的消息
20         data = client.recv(1024)
21         print(data.decode('utf-8'))
22         # 消息一经发送完毕就断开了连接
23         client.close() # 短连接
24
25     tcp_sock.close()
26
27
28 if __name__ == '__main__':
29     main()

转载于:https://www.cnblogs.com/fangtaoa/p/9041603.html

Python高级网络编程系列之基础篇相关推荐

  1. Python高级网络编程系列之第一篇

    在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握 ...

  2. python高级网络编程_Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  3. Python高级网络编程系列之第二篇

    在上一篇中,我们深入探讨了TCP/IP协议的11种状态,理解这些状态对我们编写服务器的时候有很大的帮助,但一般写服务器都是使用C/Java语言,因为这些语言对高并发的支持特别好.我们写的这些简单的服务 ...

  4. Python之网络编程(socket基础)

    文章目录 客户端/服务器架构 1.即C/S架构 2.C/S架构与socket的关系 3.两机交互的原理 Socket编程 1.socket编程的概念 2.socket的两种类型 3.socket的运行 ...

  5. python高级网络编程_python高级编程——网络编程(二)

    UDP 概念和介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并 不能保证它们能到达目的地. U ...

  6. Python之网络编程(TCP套接字与UDP套接字)

    文章目录 基于tcp的套接字 实现目标 tcp服务端源码 tcp客户端源码 tcp效果实现 基于udp的套接字 udp作用介绍 udp服务端源码 udp客户端源码 udp效果实现 用udp实现一个时间 ...

  7. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

  8. 视频教程-C# For Unity系列之基础篇-Unity3D

    C# For Unity系列之基础篇 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理 ...

  9. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信

    目录 前言 IP地址 简介 公有IP 私有IP 局域网之间网络通信 前提 功能描述 源码 运行结果 局域网与广域网网络通信 前提 源码 结语 前言 本系列博客是笔者学习Python Socket的过程 ...

最新文章

  1. 基于Python的颜色识别器
  2. 斑能不能彻底去掉_小龙虾的头、虾黄到底能不能吃?赶紧告诉身边人......
  3. 算法设计原则验证实验报告_算法设计与分析实验报告 统计数字问题
  4. Linux crontab命令
  5. 安恒杯月赛 babypass getshell不用英文字母和数字
  6. 在Linux中清空某个路径下的特定命名格式的文件夹
  7. Jedis问题解决方案大全:No more cluster attempts left
  8. Python Tkinter Grid布局管理器详解
  9. ipad iphone 开发的应用,加一个启动预览图片
  10. 修改远程桌面服务器里的密码
  11. TURN协议简要介绍
  12. ZIGBEE通过协议栈点对点通信流程
  13. java cnzz_cnzz统计图标不显示
  14. 沪江日语频道 » 日语真题
  15. XMind使用教程入门
  16. android 自定义locale,Android Locale填坑
  17. javascript如何获取request中的数据
  18. Linux安装Nginx以及配置前端项目
  19. 联合国安理会默哀悼念汶川大地震遇难者(组图)
  20. pbootcms自定义表单增加搜索

热门文章

  1. python 忽略 异常_如何忽略Python中的异常?
  2. Java Number shortValue()方法与示例
  3. Java Double类compareTo()方法与示例
  4. tooctalstring_Java Integer类toOctalString()方法的示例
  5. python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子
  6. 【c语言】棋盘游戏--三子棋
  7. exec函数族实例解析
  8. 【C++ Primer | 16】std::move和std::forward、完美转发
  9. 疯狂涨知识!Java多态实现原理技术总监都拍手叫好
  10. C#在WinForm中打开控制台显示