原文链接:http://www.limerence2017.com/2018/01/02/python20/

python 网络编程和基本的C语言编程一样,效率不是很高,如果为了封装通信库
建议采用C/C++做底层封装,采用epoll、poll、iocp等网络模型封装,编译成网络库
供其他模块使用。这里在python学习过程中介绍一下

TCP 编程 服务器端

创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AF_INET表示网络通信,SOCK_STRAM表示面向字节流TCP方式通信。
绑定端口和地址
s.bind((‘127.0.0.1’,9999))
监听套接字
s.listen(5)
5,表示监听队列最大多长。
接收客户端连接
sock, addr = s.accept()
s为生成的socket,accept接收客户端连接,返回对端描述符和地址
接收数据
data = sock.recv(1024)
sock为对端socket,recv接收数据,最多接收1024
发送数据
sock.send((‘Hello, %s’ %data.decode(‘utf-8’)).encode(‘utf-8’))
关闭描述符
sock.close()

TCP客户端编程

创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
建立连接
s.connect((‘127.0.0.1’, 9999))
接收消息和发送消息
s.send(data)
s.recv(1024).decode(‘utf-8’)
关闭描述符
s.close()

服务端案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import socket
import threading
import time #线程处理函数
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8')=='exit':
break
sock.send(('Hello, %s' %data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.'%addr) #服务器tcp编程流程
#创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定套接字
s.bind(('127.0.0.1',9999))
#监听套接字
s.listen(5) print('Waiting for connection...')
# 调用accept接受连接
while True:
# 接收新的连接
sock, addr = s.accept()
# 创建新的线程处理TCP
t = threading.Thread(target=tcplink,args=(sock,addr))
t.start()

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket

#创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

UDP通信

udp通信和tcp通信不一样,很简单。服务器端不需要监听和accept,
客户端也不需要connect。
服务端 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999)) print('Bind UDP on 9999...')
while True:
# 接收数据:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello, %s!' % data, addr)

服务器端绑定好端口和地址后,调用recvfrom返回数据和对端地址
客户端 示例:

1
2
3
4
5
6
7
8
9
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()

客户端发送数据和接收数据和之前一样,仅仅是不需要调用connect连接服务器了。

谢谢关注我的公众号:

python学习(20) 网络编程的更多相关文章

  1. python学习之网络编程基础

    引入场景:客户与银行关系 银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系.此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关 ...

  2. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...

  3. Python学习之==>网络编程

    一.什么是网络编程 使用Python进行网络编程,就是通过Python打开一个网站,或者请求一个http接口.可以通过标准模块urllib实现,也可以通过更简单易用的第三方模块requests实现. ...

  4. python学习总结---网络编程

    网络编程 相关概念 - OSI七层模型:它从低到高分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. - TCP/IP: 在OSI七层模型基础上简化抽象出来的一套网络协议簇,现在得到 ...

  5. Python学习--19 网络编程

    TCP编程 Client 创建一个基于TCP连接的Socket: # coding: utf-8 import socket # 创建一个TCP连接: s = socket.socket(socket ...

  6. Python学习day36-并发编程(2)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  7. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  8. Python学习day40-并发编程(终)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. Python学习day39-并发编程(各种锁)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. tty命令详解

    基础命令学习目录首页 原文链接:http://blog.chinaunix.net/uid-9525959-id-2001836.html [功能]  打印连接到标准输入的终端的文件名. [描述]  ...

  2. Nginx 使用(server参数配置)

    文件地址nginx/conf/Nginx.conf 文件地址;nginx/conf/Nginx.conf [java] view plain copy server {# 服务名及配置,一个服务下可以 ...

  3. 【Alpha】阶段第十次Scrum Meeting

    [Alpha]阶段第十次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 登出接口 编写后端说明文档 赵智源 编写脚本实现测试的持续集成 前测试点页面跳转逻辑测试 ...

  4. vim文本处理技巧

    如果要把这篇文章写的详细透彻,那我没有必要去书写,因为已经有了这本书--<Vim实用技巧> 如果时间和精力足够的同学可以购买或者借阅,真的是写的很详细. Vim实用技巧 (豆瓣)http: ...

  5. Java script 的dom编程

    实例1: </head> <body> <div id="div1"> <p id="p1">这是一个段落< ...

  6. 2018软工实践—Alpha冲刺(10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试整体软件 展示GitHub当 ...

  7. beat冲刺(4/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  8. Beta Scrum Day 6 — 听说

    听说

  9. BNUOJ 52318 Be Friends prim+Trie

    题目链接: https://acm.bnu.edu.cn/v3/problem_show.php?pid=52318 B. Be Friends Case Time Limit: 2500msMemo ...

  10. java小学生四则运算带面板版 但我不知道为什么同类变量却进不了动作监听中去

    ---恢复内容开始--- package yun; import java.util.*; import java.awt.*; import java.awt.event.ActionEvent; ...