Python网络编程
两种模式:
一种tcp可靠连接,能够保证数据不丢失
一种udp 不关心数据是否会丢失,在乎传输效率
TCP编程
一点:服务端
二点:客户端
第一次握手:客户端发送报文,连接服务端
第二次握手:服务端发送报文,你可以连接
第三次握手:客户端发送确认报文,我真的要连接
服务端的编写:
java:socketServer(ip,port)
Python:socket.socket()
1、创建socket.socket()
2、绑定地址和端口号
3、监听客户端请求
4、接受客户端的请求,并为之开辟一个线程来处理它的业务逻辑
知识点:
socket 网络通信的基本知识
tcp的服务端和客户端的案例
服务端:
"""
1、创建 socket.socket()
2、绑定地址和端口号
3、监听客户端请求
4、接受客户端的请求,并为之开辟一个线程来处理他的业务逻辑。
"""
import socket
#一、创建socket.socket()
#下面讲的是family
#family :地址族,也就是IP地址类型,常用的IP地址类型有两种:AF_INET,AF_INET6
#AF :Address Family
#INET :Inetnet的缩写
#AF_INET :默认是IPv4
#AF_INET6 :IP6的缩写
#family=AF_INET,type=SOCK_STREAM,proto=0
#type:
#type是表示的数据传输的方式
#type=SOCK_STEAM :面向连接传输方式,数据可以准去到达另外一台机器,如果数据丢失就会重发,效率相对比较低
#type=SOCK_DGRAM :表示无连接的传输方式,计算机只管传输数据,不做数据校验,相对快。
#@@使用的是SOCK_DGRAM这种方式。
#proto:
#传输协议:一般都有TCP,UDP
#下面创建的是IPV4的服务
import threading
import time
def run(sock, addr):
print(addr)
sock.send("接收到消息,开始运行.....".encode('utf-8'))
while True:
data =sock.recv(1024)
if data == b"":
continue
print("-----------服务端start--------")
print(data.decode('utf-8'))
print("-----------服务端end--------")
value = data.decode('utf-8');
#str转成bytes的两种方式
#(1)直接通过str.encode("utf-8")的方式
#(2)通过创建bytes("字符串")对象来得到比特数组
sock.send((value+value).encode('utf-8'))
socket_server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
#二、绑定地址和端口号
socket_server.bind(("127.0.0.1",8888))
#三、监听客户端请求
socket_server.listen()
#四、接受客户端的请求,并为之开辟一个线程来处理它的业务逻辑
#不停的循环,问有没有请求
while True:
#接收一个请求
#sock 是网路通道 用来读写数据
#addr 是客户端ip地址
(sock,addr) = socket_server.accept()
#创建线程
thread = threading.Thread(target=run,name="线程",args= (sock, addr))
#启动线程
thread.start()
客户端:
"""
1、创建一个socket连接,得到一个client端
2、连接服务器 知道服务器的ip地址和端口号
3、获取数据,并打印出来
"""
import socket
#1、创建一个socket连接,得到一个client端
import time
socket_client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
#2、连接服务器 知道服务器的ip地址和端口号
socket_client.connect(("127.0.0.1",8888))
data = socket_client.recv(1024)
# 将字节数组转换成 字符串的两种方式
# 1,在服务端发送数据的时候,可以将将字符串转成bytes
#(1):调用对象的 str.encode('utf-8')
#(2): bytes(value,encoding="utf-8")
# 2,在客户端接受数据的是,将bytes转成字符串
#(1)调用对象的 str.decode('utf-8')
#(2)str(data,encoding='utf-8')
print(data.decode("utf-8"))
print(str(data,encoding="utf-8"))
#发送数据到服务端,发过去之后,在tcp_server.py中又,重新发过来,在客户端又接收到
for item in ["aaaa","bbbbbbbbbbbbbb","ccccccccccccccc","发送一下数据"]:
time.sleep(1)
socket_client.send(item.encode("utf-8"))
while True:
data = socket_client.recv(1024)
if data == b"":
continue
print("-----------客户端start--------")
print(data.decode("utf-8"))
print("-----------客户端end----------")