Python网络编程

基本概念

  • 套接字

套接字(socket) 是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行,Linux提供的功能(打印服务,ftp等)通常时通过套接字来进行通信的,套接字的创建和使用与管道有区别,因为套接字明确的客户和服务器分出来,套接字可以实现将多个客户连接到一个服务器

套接字用(IP地址:端口号)表示
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地进程的协议端口,远程主机的IP地址,远地进程的协议端口。

其中最重要的协议就是 tcp,udp协议

tcp 是一种面向连接的、可靠的、基于字节流的传输层协议。可靠体现在他的重发和校验机制

UDP时一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务

通信的概念

通信:信息的传递,分为服务端和客户端
就像公司前台,他不会主动找你,他会在那等你
服务端通常会保持被动阻塞式的接收,等待客户端前来访问
客户端通过ip和端口主动访问服务端,二者后见通信信道,实现信息传输

  • 通信的方式
  1. 单工通信,通信双方只有一条信道,且身份不可逆。
    比如对讲机,一方说话,另一方只能接受不能发送
  2. 半双工通信,通信双方只有一条信道,但通信身份可逆
  3. 全双工通信,通信双方有多条信道,且身份可逆

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()	#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值