基于TCP的套接字通信

以买手机的过程为例
服务端代码

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、绑定手机卡
phone.bind(('127.0.0.1', 8081)) # 0-65535, 1024以前的都被系统保留使用 # 3、开机
phone.listen(5) # 5指的是半连接池的大小
print('服务端启动完成,监听地址为:%s:%s' % ('127.0.0.1', 8080))
# 4、等待电话连接请求:拿到电话连接conn
conn, client_addr = phone.accept()
# print(conn)
print("客户端的ip和端口:", client_addr) # 5、通信:收\发消息
data = conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
print("客户端发来的消息:", data.decode('utf-8'))
conn.send(data.upper()) # 6、关闭电话连接conn(必选的回收资源的操作)
conn.close() # 7、关机(可选操作)
phone.close()

客户端代码

import socket

#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 #2、拨通服务端电话
phone.connect(('127.0.0.1',8081)) #3、通信
import time
time.sleep(10)
phone.send('hello egon 哈哈哈'.encode('utf-8'))
data=phone.recv(1024)
print(data.decode('utf-8')) #4、关闭连接(必选的回收资源的操作)
phone.close()

加上通信循环

服务端

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、绑定手机卡
phone.bind(('127.0.0.1', 8083)) # 0-65535, 1024以前的都被系统保留使用 # 3、开机
phone.listen(5) # 5指的是半连接池的大小
print('服务端启动完成,监听地址为:%s:%s' % ('127.0.0.1', 8080)) # 4、等待电话连接请求:拿到电话连接conn
conn, client_addr = phone.accept() # 5、通信:收\发消息
while True:
try:
data = conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
if len(data) == 0:
# 在unix系统洗,一旦data收到的是空
# 意味着是一种异常的行为:客户度非法断开了链接
break
print("客户端发来的消息:", data.decode('utf-8'))
conn.send(data.upper())
except Exception:
# 针对windows系统
break # 6、关闭电话连接conn(必选的回收资源的操作)
conn.close() # 7、关机(可选操作)
phone.close()

客户端

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、拨通服务端电话
phone.connect(('127.0.0.1', 8083)) # 3、通信
while True:
msg = input("输入要发送的消息>>>: ").strip() # msg=''
if len(msg) == 0:
continue
phone.send(msg.encode('utf-8'))
print('======?')
data = phone.recv(1024)
print(data.decode('utf-8')) # 4、关闭连接(必选的回收资源的操作)
phone.close()

加上链接循环

服务端应该满足的特点: 1、一直提供服务 2、并发地提供服务

# 服务端
import socket # 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、绑定手机卡
phone.bind(('127.0.0.1', 8080)) # 0-65535, 1024以前的都被系统保留使用 # 3、开机
phone.listen(5) # 5指的是半连接池的大小
print('服务端启动完成,监听地址为:%s:%s' % ('127.0.0.1', 8080)) # 4、等待电话连接请求:拿到电话连接conn
# 加上链接循环
while True:
conn, client_addr = phone.accept() # 5、通信:收\发消息
while True:
try:
data = conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
if len(data) == 0:
# 在unix系统洗,一旦data收到的是空
# 意味着是一种异常的行为:客户度非法断开了链接
break
print("客户端发来的消息:", data.decode('utf-8'))
conn.send(data.upper())
except Exception:
# 针对windows系统
break # 6、关闭电话连接conn(必选的回收资源的操作)
conn.close() # 7、关机(可选操作)
phone.close()

客户端1

import socket

#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 #2、拨通服务端电话
phone.connect(('127.0.0.1',8080)) #3、通信
while True:
msg=input("输入要发送的消息>>>: ").strip() #msg=''
if len(msg) == 0:continue
phone.send(msg.encode('utf-8'))
print('======?')
data=phone.recv(1024)
print(data.decode('utf-8')) #4、关闭连接(必选的回收资源的操作)
phone.close()

基于UDP协议的套接字通信

服务端

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议=》udp协议

server.bind(('127.0.0.1', 8081))

while True:
data, client_addr = server.recvfrom(1024)
server.sendto(data.upper(), client_addr) server.close()

客户端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 流式协议=》tcp协议

while True:
msg = input('>>>: ').strip()
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8081))
res = client.recvfrom(1024)
print(res) client.close()

Python网络编程——TCP套接字通信、通信循环、链接循环、UDP通信的更多相关文章

  1. Python网络编程——修改套接字发送和接收的缓冲区大小

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  2. Python网络编程——处理套接字错误

    在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应. Python的Socket库提供了一个方法,能通过socket.error异常优雅地处理套接字错误. 1 ...

  3. unix网络编程——TCP套接字编程

    TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...

  4. python网络编程-socket套接字通信循环-粘包问题-struct模块-02

    前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  5. 初探网络编程--TCP套接字编程演示

    今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...

  6. TCP/IP网络编程之套接字类型与协议设置

    套接字与协议 如果相隔很远的两人要进行通话,必须先决定对话方式.如果一方使用电话,另一方也必须使用电话,而不是书信.可以说,电话就是两人对话的协议.协议是对话中使用的通信规则,扩展到计算机领域可整理为 ...

  7. 【TCP/IP网络编程】:01理解网络编程和套接字

    1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...

  8. TCP/IP网络编程之网络编程和套接字

    网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...

  9. UNIX网络编程——原始套接字(dos攻击)

    原始套接字(SOCK_RAW).应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有 root权限的人创建. 可以参考前面的博客<<UNIX网络 ...

  10. UNIX网络编程——原始套接字的魔力【续】

    如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...

随机推荐

  1. Redis数据类型之Stream系列一

    一:Stream简介 ​ Redis Stream是5.0版本之后新增的一种数据结构,其结构类似于'仅追加日志'.但也实现了多种操作来克服'仅追加日志'的一些限制,如读取策略(xread,xrange ...

  2. LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读

    LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读 KDD 2023 原文 ...

  3. 博客代码托管网站个人体会及感受(GitHub、Coding、Netlity、阿里云弹性web托管)

    GitHub 免费 部署 github上,服务器在国外,访问速度一般,稳定性比较好,网站知名,操作方便,部署简单,域名不需要备案. Coding 免费 coding 支持 PHP + mysql 的动 ...

  4. 2023-07-17:给定一个数组arr,长度为n, 再给定一个数字k,表示一定要将arr划分成k个集合, 每个数字只能进一个集合。 返回每个集合内部的平均值都累加起来最小的值。 平均值向下取整。 1

    2023-07-17:给定一个数组arr,长度为n, 再给定一个数字k,表示一定要将arr划分成k个集合, 每个数字只能进一个集合. 返回每个集合内部的平均值都累加起来最小的值. 平均值向下取整. 1 ...

  5. PHP递归和循环的速度测试

    本文于 2017-12-05 重新整理. 写了一个可以对 $_GET, $_POST 等输入进行过滤的函数,递归实现如下: function array_map_recursive($filters, ...

  6. KVM (Centos7)使用macvtap网卡的后续 -- 宿主机创建macvtap网卡,并配置ip

    因为使用虚拟机上的 macvtap 网卡与宿主机器上的网卡无法直接通信,所以需要在宿主机上也创建 macvtap 网卡,将 ip 迁移过去. 因为未能找到配置文件的设置方法,所以使用脚本来配置,并将脚 ...

  7. 代码随想录算法训练营第二天| LeetCode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 文章讲解:https://programmercarl ...

  8. Blazor前后端框架Known-V1.2.9

    V1.2.9 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...

  9. HTTPS 是这样握手的

    HTTP协议默认是明文传输,存在一定的安全隐患,容易被中间人窃听和攻击,在 加密解决HTTP协议带来的安全问题 中提到使用哈希.对称加密.非对称加密等方式对数据加密,能解决数据安全的问题. 以上加密方 ...

  10. 彻底弄懂js中this指向(包含js绑定、优先级、面试题详解)

    为什么要使用this 在javascript中,this可谓是无处不在,它可以用来指向某些元素.对象,在合适的地方使用this,能让我们减少无用代码的编写 var user = {   name: & ...