Python网络编程
基本概念
- 套接字
套接字(socket) 是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行,Linux提供的功能(打印服务,ftp等)通常时通过套接字来进行通信的,套接字的创建和使用与管道有区别,因为套接字明确的客户和服务器分出来,套接字可以实现将多个客户连接到一个服务器
套接字用(IP地址:端口号)表示
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地进程的协议端口,远程主机的IP地址,远地进程的协议端口。
其中最重要的协议就是 tcp,udp协议
tcp 是一种面向连接的、可靠的、基于字节流的传输层协议。可靠体现在他的重发和校验机制
UDP时一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
通信的概念
通信:信息的传递,分为服务端和客户端
就像公司前台,他不会主动找你,他会在那等你
服务端通常会保持被动阻塞式的接收,等待客户端前来访问
客户端通过ip和端口主动访问服务端,二者后见通信信道,实现信息传输
- 通信的方式
- 单工通信,通信双方只有一条信道,且身份不可逆。
比如对讲机,一方说话,另一方只能接受不能发送 - 半双工通信,通信双方只有一条信道,但通信身份可逆
- 全双工通信,通信双方有多条信道,且身份可逆
ps:小范围的丢包,不会影响通信的质量,这叫可容忍误码率
Python聊天工具编写
需求描述
附上代码
分别是recv.py和client.py代表客户端和服务端。运行以break结束,两端都需要break来结束。因为要break来结束socket接口,所以在运行过程中只要出错了,就必须关闭端口服务再打开,来重置socket。我是重启来解决的- -。
#client.py
**import socket
print("I am client")
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("127.0.0.1",8000))
while True:
recv = sock.recv(512).decode()
print(recv)
if recv == "break" :
break
sendData = input("-->").encode()
sock.send(sendData)
if sendData == "break" :
break
sock.close() **
#rece.py
import socket
print("I am server")
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(("127.0.0.1",8000))
sock.listen(5)
con,add = sock.accept()
print("%s:%s is connect " %add)
while True:
sendData = input("-->").encode()
con.send(sendData) #发送需要的是字节
if sendData == "break".encode() :
break
recv = con.recv(512) #单次接收的大小 字节
print(recv.decode())
if recv == "break" :
break
sock.close()
#这是对编写代码中用到的socket方法的介绍,是基础版的接收端。
import socket
print("I am server")
#创建socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#scoket family socket族
#AF_INET ipv4
#AF_INET ipv6
#AF_UNIX linux系统间数据传输
#socket type
#SOCK_STREAM tcp
#SOCK_DGRAM udp
sock.bind(("127.0.0.1",8000))
#双元素元组
#元素一 ip
#元素二 端口 数字
sock.listen(5)
#监听队列长度
#接收
con,add = sock.accept()
#con 通信对象,也是一个socket对象
#add 地址,身份
print(add)
#发送
con.send("hello world".encode()) #发送需要的是字节
recv = con.recv(512) #单次接收的大小 字节
sock.close() #