一、简介
scoket(套结字)在python就是模块
二、分类
基于文件型(不用)
基于网络型
名字:AF_INET
AF_INET6
三、scoket应用
1、基于tcp
长连接:基于tcp的Server端只能和一台Client端进行数据传输
特点
必须先运行Server端,再运行Client端
在Server端,第一次可以接收或发送信息
# server端,基于tcp协议 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.listen() connect, addr = sk.accept() ret = connect.recv(1024).decode('utf-8') print(ret) connect.send(bytes('hello', encoding='utf-8')) connect.close() sk.close()
# client端,基于tcp协议 import socket sk = socket.socket() sk.connect(('127.0.0.1', 8010)) sk.send(bytes('你好', encoding='utf-8')) ret = sk.recv(1024).decode('utf-8') print(ret) sk.close()
# server端,基于tcp协议 """ 优化,实现简单的对话功能 """ import socket sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.listen() connect, addr = sk.accept() while 1: ret = connect.recv(1024).decode('utf-8') print(ret) if ret == 'byte': break info = input('server>>>') connect.send(bytes(info, encoding='utf-8')) connect.close() sk.close()
# client端,基于tcp协议 """ 优化,实现简单的对话功能 """ import socket sk = socket.socket() sk.connect(('127.0.0.1', 8010)) while 1: info = input('client>>>') sk.send(bytes(info, encoding='utf-8')) if info == 'byte': break ret = sk.recv(1024).decode('utf-8') print(ret) sk.close()
注意:
1)sk.accept()和sk.connect(),里面是tuple
2)在bind前加
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
3)网络传输用bytes类型
4)客户端和服务器的send和recv是相互关联的
2、基于udp协议
基于udp协议,不需要监听和连接,发送和接收都有两个参数(信息,地址)
特点:
Server端和Client端运行的顺序没有先后
在Server端,第一次只能接收信息
""" 基于udp协议 Server端 聊天系统 """ import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1', 8010)) while 1: msg, addr = sk.recvfrom(1024) new_msg = msg.decode('utf-8') print(new_msg) # if new_msg == 'byte': # break info = input('Server>>>') sk.sendto(info.encode('utf-8'), addr) if info == 'byte': break sk.close()
""" 基于udp协议 Client端 """ import socket sk = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1', 8010) while 1: info = input('Client1>>>') new_info = ('来自Client的消息:' + info).encode('utf-8') sk.sendto(new_info, ip_port) if info == 'byte': break msg, addr = sk.recvfrom(1024) new_msg = msg.decode('utf-8') print(new_msg) if new_msg == 'byte': break sk.close()
""" 基于udp协议 Client2端 """ import socket sk = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1', 8010) while 1: info = input('Clinet2>>>') new_info = ('来自Client2的消息:' + info).encode('utf-8') sk.sendto(new_info, ip_port) if info == 'byte': break msg, addr = sk.recvfrom(1024) new_msg = msg.decode('utf-8') print(new_msg) if new_msg == 'byte': break sk.close()
注意:
发送和接收数据,有两个参数(数据,地址)
Server端不需要监听和连接,Client端不需要连接
网络传输的数据类型是bytes,注意字符编码
Server端第一次只能接收信息