#1.网络通讯步骤
确定对端IP地址->确定应用程序端口->确定通讯协议
总结:网络通讯的过程其实就是一个(源端)不断封装数据包和(目的端)不断拆数据包的过程
服务器:
"""" socket是一个接口、传送的对象 连接的通道 SOCK_STREAM:TCP SOCK_Dgram:UDP family=AF_INRT 服务器之前的通信 family=AF_UNIX Unix不同进程间通信 各sk绑定各自的端口 conn是连接server和client的 都是通过conn进行send evc """ import socket #两个参数 family和type sk=socket.socket() address=('127.0.0.1',8000) sk.bind(address) #该过程为绑定 # 内容必须为元组 sk.listen(3) #容纳排列数 print('waiting...') conn,addr=sk.accept() #将元组两个变量赋给两个变量 #conn.send('约啊') # inp=input('>>>') # conn.send(bytes(inp,'utf-8')) """"" client: <socket.socket fd=284, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0> server: (<socket.socket fd=524, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 53747)>, ('127.0.0.1', 53747)) 两个sk没有任何关系 """ """"" server下的方法:一收一发 bind() listen() accept() recv()#收 send()#发 sendall()#将send放在while中循环发送 即将传送的字符全部发送完 clinent下的方法: connect() recv() send() sendall() close """"" #2.客户端接收 """"" data=conn.recv(1024) print(data) """ #conn.close()#只关闭了一个用户 #sk.close()#关闭了整个server程序端 #双方交互 while 1:#套住下一个循环 与下部分被引效果一样 conn,addr=sk.accept() while 1: try: data=conn.recv(1024) except Exception as e: break #上述异常处理是为了防止用户不用exit而选择 直接退出 if not data: break """"" #当客户结束时,接收下一个客户 conn.close() conn,addr=sk.accept() print(addr) continue """"d print(str(data,'utf-8')) inp=input('>>>') onn.send(bytes(inp,'utf-8')) sk.close #当收到空的时候 是不会有反应的 参考qq 直接发送不会有反应
客户:
import socket sk=socket.socket() print(sk) address=('127.0.0.1',8000) sk.connect(address) #data=sk.recv(1024)#参数为指定收多少 #print(data) #print(str(data,'utf-8'))#为了转义 #无论是拿还是发 都是bytes类型 #2.客户的发送 """"" data1=sk.send(bytes('hhh','utf-8')) """ #双方进行不断地交互 while True: inp=input('>>>') if inp =='exit': break sk.send(bytes(inp,'utf-8')) data=sk.recv(1024) print(str(data,'utf-8')) sk.close()