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 threadingimport timedef run(sock, addr):print(addr)sock.send("接收到消息,开始运行.....".encode('utf-8'))while True:data =sock.recv(1024)if data == b"":continueprint("-----------服务端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 timesocket_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"":continueprint("-----------客户端start--------")print(data.decode("utf-8"))print("-----------客户端end----------")
右键运行服务端和客户端,运行结果是:
客户端代码: