网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API)

主要内容:

  • 1.基于TCP协议下的socket通信流程
  • 2.基于UDP协议下的socket通信流程
  • 3.粘包现象

1.基于TCP协议下的socket通信流程

(1)TCP和UDP的对比

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

应用层对应协议:HTTP,SMTP,POP3对应设备:无
传输层对应协议:TCP与UDP协议对应设备:四层交换机,四层的路由器
网络层对应协议:IP协议对应设备:路由器,三层交换机
数据链路层对应协议:arp协议对应设备:网桥,以太网交换机,网卡
物理层对象协议:无对应设备:中继器,集线器,双绞线

3次握手

client syn1 随机产生seq=j 进入syn_sent

server 收到syn1 将标志位synACK都置为1 ack=j+1 产生seq=K 进入syn_rcvd状态

client收到后检查ack是不是j+1 如果是将标志位synack都置为1 ack=K+1 双方进established

4次断开

Client发送 fin 进入fin_wait_1状态

Server 收到fin 发送ack 确认序列号+1 close_wait状态  #告诉客户端你先等一下,我看下我的管道里面是否还有信息,如果有给处理完

Server发送一个fin关闭连接  server进入 last_ack状态

Client收到fin进入 time_wait 发送ackserver server进入closed(刻漏声的)

TCP 和UDP下socket差异对比图

(2) TCP协议下的socket通信流程

具体的通信流程

  • 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
  • 在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
  • 客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

TCP服务器端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接 执行这句,表示建立了3次握手
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字 执行这句,表示经历了4次挥手
sk.close()        #关闭服务器套接字(可选) 关闭套接字,不在接收客户端请求。

tcp_server.py

TCP 客户端

import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(/接收)
print(ret)
sk.close()            # 关闭客户套接字

tcp_client.py

#############udp###################

UDP server 通信

import socket
udp_server = socket.socket(type=socket.SOCK_DGRAM) #设置udp方式
ip_port = ('127.0.0.1',8002)
udp_server.bind(ip_port)#把地址绑定到套接字
from_client_msg,client_addr = udp_server.recvfrom(1024)#服务器接收服务发来的值

udp_server.sendto(b'fuwuqi',client_addr)#服务器说 发送给客户端print(from_client_msg,client_addr)#打印服务器说的话  客户端的地址

UDP client 通信

import socket
udp_client = socket.socket(type=socket.SOCK_DGRAM)#使用udp方式
ip_port = ('127.0.0.1',8002)##把地址绑定到套接字
udp_client.sendto(b'hello',ip_port)#客户端 向服务器端发动hello ip地址端口

from_server_msg,server_addr = udp_client.recvfrom(1024)#客户端接收服务发来的值
print(from_server_msg,server_addr)#打印出来

################udp  while方式+名字#################

####server
import socket
lst = {'egon': '\033[1;31m', 'yuan': '\033[1;34m'}
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 9090))
while True:msg, client_addr = sk.recvfrom(1024)  # udp协议不用建立链接name, mesg = msg.decode('utf-8').split(':')color = lst.get(name.strip(), '')print('%s%s\033[0m' % (color, msg.decode('utf-8')))inp = input('>>>')sk.sendto(inp.encode('utf-8'), client_addr)
sk.close()

client

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
name = input('请输入名字: ')
while True:inp = input('请输入发送内容: ')#名字sk.sendto(('%s : %s' % (name, inp)).encode('utf-8'), ('127.0.0.1', 9090))msg, addr = sk.recvfrom(1024)print(msg.decode('utf-8'))
sk.close()

#################写出面向对象的实现方法

###mysocket.py
from socket import *  # 导入socket模块
class Mysocket(socket):  # 继承socketdef __init__(self,coding='utf-8'):  # 默认编码为utf-8self.coding = codingsuper().__init__(type=SOCK_DGRAM)  # 设定为udp协议def my_recv(self,num):  # num表示最大字节,比如1024msg,addr = self.recvfrom(num)return msg.decode(self.coding),addr  # 返回解码后的接收信息def my_send(self,msg,addr):  # msg和addr分别表示发送信息和连接ip:端口return self.sendto(msg.encode(self.coding),addr)  # 发送编码后的信息

######Server02.py
from mysocket import Mysocket
sk = Mysocket()  # 可以指定编码,默认为utf-8
lst = {'eva': '\033[1;31m', 'yuan': '\033[1;34m'}
sk.bind(('127.0.0.1', 9090))
while True:msg, client_addr = sk.my_recv(1024)  # udp协议不用建立链接name, mesg = msg.split(':')color = lst.get(name.strip(), '')print('%s%s\033[0m' % (color, msg))inp = input('>>>')sk.my_send(inp, client_addr)
sk.close()

##client02
from mysocket import Mysocket
sk = Mysocket()
name = input('请输入名字: ')
while True:inp = input('请输入发送内容: ')sk.my_send(('%s : %s' % (name, inp)), ('127.0.0.1', 9090))msg, addr = sk.my_recv(1024)print(msg)
sk.close()

################时间同步服务 

import time
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9090))#绑定端口
while True:msg,addr = sk.recvfrom(1024)#接收print(msg,addr)sk.sendto(time.strftime(msg.decode('utf-8')).encode('utf-8'),addr)#发送
sk.close()# a=time.strftime('%Y/%m/%d %H:%M:%S')
# print(a)

import time
import socketsk = socket.socket(type=socket.SOCK_DGRAM)
while True:sk.sendto('%Y/%m/%d %H:%M:%S'.encode('utf-8'), ('127.0.0.1', 9090))  # 执行时间格式ret, addr = sk.recvfrom(1024)#接收print(addr,ret.decode('utf-8'))time.sleep(1)  # 暂停1秒执行
sk.close()

转载于:https://www.cnblogs.com/zaizai1573/p/10217447.html

python socket原理 及socket如何使(tcp udp协议)相关推荐

  1. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  2. QQ--基于TCP/UDP协议的通讯原理

    QQ是一个基于TCP/UDP协议的通讯软件  发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服 务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!   一 ...

  3. 最全的TCP/UDP 协议知识点整理

    关于计算机网络的基础知识,我前面写的两篇文章是入门文章,可以帮你构建一个计算机网络的基础架构,有了这个基础架构,后面的学习会很简单.下面是两篇文章的连接~~ 计算机网络体系结构与参考模型(1) 计算机 ...

  4. 【计算机网络】传输层 : 总结 ( TCP / UDP 协议 | 寻址与端口 | UDP 协议 | TCP 协议特点 | TCP 连接释放 | TCP 流量控制 | TCP 拥塞控制 ) ★★★

    文章目录 一.传输层 TCP / UDP 协议 ★ 二.寻址端口号 ★ 三.UDP 协议特点 四.UDP 协议首部格式 五.UDP 校验 六.TCP 协议 特点 ★ 七.TCP 报文段首部格式 八.T ...

  5. 利用TCP/UDP 协议制作一个飞秋聊天工具

    视频操作演示: 利用TCP/UDP 协议制作一个飞秋聊天工具演示视频 int udp_broadcast(char const*argv[]) {//1.创建对象udp_socket = socket ...

  6. 网络层协议与应用及传输层TCP/UDP协议

    网络层协议与应用及传输层TCP/UDP协议 目录 一.IP数据包格式 二.ICMP协议 三.ARP协议及ARP工作原理 四.TCP协议及常用端口号 五.UDP协议及常用端口号 一.IP数据包格式 网络 ...

  7. 什么是TCP/UDP协议?(超简单,一看就会)

    TCP/UDP协议做了什么? TCP/UDP协议处于计算机网络的第四层"传输层",负责传输数据包. 数据包怎么传?(UDP协议) TCP/UDP协议处于计算机网络的第四层" ...

  8. TCP/UDP协议总结与应用层常见协议及端口

    TCP/UDP协议总结与应用层常见协议及端口 1.TCP协议 TCP协议概述 TCP的应用场景 TCP的特点 TCP的报文格式 TCP三次握手 TCP四次挥手 2.UDP协议 UDP概述 UDP的应用 ...

  9. socket网络编程套接字TCP/UDP两种方式详解

    目录 准备知识 源IP地址和目的IP地址 端口号与进程ID 传输层协议--TCP 传输层协议--UCP 网络字节序 socket套接字介绍 概念 常见的三种socket socket编程常见API s ...

  10. socket协议 http协议的区别,长短连接,tcp/udp协议区别

    socket http协议的区别 简单来说,我们平常浏览的网页如果已http://开头的都是http协议传输到我们的浏览器的,而http是基于socket之上的,就是说http携带数据,socket提 ...

最新文章

  1. 为什么平头哥做芯片如此迅猛?
  2. Gitlab+Gerrit+Jenkins完整对接
  3. 这样调优:让你的 IDEA 快到飞起来,效率真高!
  4. [深度学习] AutoDis --- KDD2021 连续特征的Embedding学习框架
  5. 关于徒手脱壳的几种方法
  6. linux 进程 异常日志,linux后台启动程序,处理nohup日志太大的问题
  7. 显示器屏幕尺寸及分辨率
  8. 调整姿势!登顶 MacBook高效工作环境配置!
  9. catia怎么将特征参数化_catia 怎么做参数化设计
  10. pytz 太平洋时区_使用pytz模块打印所有时区的Python程序
  11. IBM SPSS Statistics如何快速有效地录入数据
  12. 可转债第三课:如何赚取可转债的高收益
  13. 2022最详细最快微信聊天记录备份&导出方案
  14. Ubuntu 误删文件恢复方法
  15. (Python)从零开始,简单快速学机器仿人视觉Opencv---运用四:图像损痕修复
  16. ML之VC维:VC维(Vapnik-Chervonenkis Dimension)理论的概述(衡量模型复杂度和预测能力的指标)的简介、案例理解之详细攻略
  17. C语言malloc()和free()函数
  18. 从零开始开发、运营微信小程序的5点感受
  19. Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)
  20. 新病毒或已潜伏电脑 同样源自美国武器库

热门文章

  1. 新华三模拟器Telnet/远程登录
  2. 搭建html5的,HTML5 - 搭建移动Web应用
  3. C++11中thread库join和detach的区别
  4. C++程序设计(三:可视化)
  5. jumpserver的安装
  6. 美团面试题:Java-线程池 ThreadPool 专题详解
  7. mount error(12): Cannot allocate memory解决办法
  8. 网络对抗技术——密码破解技术
  9. 【剑指Offer学习】【面试题22:栈的压入、弹出序列】
  10. Guava 相关文章