一、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,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

代码实现如:

 import socket

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

Python高级网络编程系列之基础篇的更多相关文章

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

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

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

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

  3. Python高级网络编程系列之终极篇---自己实现一个Web框架

    通过前面几个小节的学习,现在我们想要把之前学到的知识点给串联起来,实现一个很小型的Web框架.虽然很小,但是用到的知识点都是比较多的.如Socket编程,装饰器传参在实际项目中如何使用.通过这一节的学 ...

  4. Python高级网络编程系列之第三篇

    在高级篇二中,我们讲解了5中常用的IO模型,理解这些常用的IO模型,对于编写服务器程序有很大的帮助,可以提高我们的并发速度!因为在网络中通信主要的部分就是IO操作.在这一篇当中我们会重点讲解在第二篇当 ...

  5. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  6. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  7. python之网络编程

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用 ...

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

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

  9. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

随机推荐

  1. [日常] Go语言圣经-匿名函数习题2

    练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面.只保存来自原始域名下的页面.假设初始页面在golang.org下,就不 要保存vimeo.com下的页面. p ...

  2. Java - HashTable源码分析

    java提高篇(二五)-----HashTable 在java中与有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,valu ...

  3. 微信小程序传参数的几种方法

    1,navigator 跳转时 wxml页面(参数多时可用“&”) <navigator url='../index/index?id=1&name=aaa'></n ...

  4. MySql循环语句

    drop procedure if exists test_insert; DELIMITER ;; CREATE PROCEDURE test_insert () BEGIN DECLARE i I ...

  5. HTTP协议学习随笔

    一 HTTP概述 HTTP简单说其实就是一套语言交流规则!Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱. B/S结构 用户在浏览器, ...

  6. 关于初步搭建完成SSH环境之后,JUnit test 测试成功,页面测试时:@Resource 注入的dao为null

    这个问题研究了一天,还是因为配置的时候没有认真,一不小心,酿成了大错.当发现的时候感觉好尴尬啊::>_<:: CostAction: package com.tenni.action; i ...

  7. Windows7安装nginx后,'nginx -t -c nginx.conf' 命令出现 “could not open error log file: CreateFile() "logs/error.log" failed” 错误的原因

    网上搜索安装nginx的方法,按照步骤在 http://nginx.org/en/download.html 下载了安装包,并配置了conf/nginx.conf,将nginx的根目录添加进了环境变量 ...

  8. js判断数组是否包含某个字符串变量

    最近碰到一个这样的现象,后台返回的数据中,数组里面有一些有变量值,有一些没有变量值. 举个例子,比如后台返回的例子是这样的: var arr=[ { "status":" ...

  9. Expo大作战(十)--expo中的App Icon,expo中的Assets,expo中的ErrorHandling错误处理

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  10. 【python】python之tuple元组

    tuple特性 python的tuple与列表类似,不同之处在于tuple的元素不能修改. tuple使用小括号,列表使用方括号. tuple创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. ...