socket通信基于tcp和udp
TCP和UDP的区别:
1.TCP是面向连接的,UDP是无连接的,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达,UDP没有可靠性。
2、TCP是面向字节流的,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。TCP是全双工的可靠信道,UDP是不可靠信道。
基于tcp的socket服务端
# 1.首先引用socket库 2.创建socket套字节对象 3.绑定ip和端口 4.监听来自客户端的连接,可设置连最大连接数 5.接收来自客户端连接 6.接收消息及回复(发送)消息 import socket # socket.AF_INET 基于网络 ,socket.SOCK_STREAM 以字节流的方式 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 重用地址 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和端口 s.bind((‘127.0.0.1‘, 8000)) # 监听连接 s.listen(5) print("服务端启动...") # 接收连接,返回元组 conn, addr = s.accept() # 主动发消息给客户端,调用send()方法,将字符串转成字节流发送给客户端 conn.send("来自服务端的问候".encode(‘utf-8‘)) print("conn: %s addr: %s" %(conn, addr)) try: while True: # 调用recv的方法接收客户端的消息,每次1024字节的接收 msg = conn.recv(1024) if msg: # 接收到的消息是字节流,需要解码成字符串对象 print("收到来自客户端的消息: %s" % msg.decode(‘utf-8‘)) # input 用户输入 to_msg = input("请输入要发送给客户端的消息: ") if to_msg:
# 回复 conn.send(to_msg.encode(‘utf-8‘)) else: pass except Exception: print("error") finally: # 关闭客户端连接 conn.close() # 关闭服务端 s.close()
基于tcp的socket客户端
import socket # 创建socket对象 c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # c.connect((‘127.0.0.1‘, 8000)) # 与服务端建立连接, 参数地址,端口,传入一个元组 c.connect((‘127.0.0.1‘, 8888)) print("客户端启动...") while True: # 用户输入 msg = input("请输入要发送给服务端的消息: >>>") if msg: # 发消息给客户端 c.send(msg.encode(‘utf-8‘)) else: print("抱歉您未输入任何信息!") msg = input("请输入要发送给服务端的信息: >>>") rec_msg = c.recv(1024) if rec_msg: print("收到来自服务端的消息: %s" % rec_msg.decode(‘utf-8‘)) else: break # 关闭连接 c.close()
socket是单线程,socket服务端接收一个客户端请求,其他客户端请求进入等待。listen()限制最大接收的请求数量。
收发消息时: 硬盘->以字节流的方式读入内存缓冲区->通过网络拷贝到接收方的内存缓冲区->写入接收方硬盘->清空内存缓冲区
基于udp的socket服务端
# udp服务端 无连接 from socket import * ip_port = (‘127.0.0.1‘, 8000) rec_size = 1024 # 创建一个udp套字节对象, AF_INET基于网络,SOCK_DGRAM 数据报的方式 s_udp = socket(AF_INET, SOCK_DGRAM) # 绑定ip和端口 s_udp.bind(ip_port) print("服务端开始服务中....") while True: # 接收客户端的消息和地址 data, address = s_udp.recvfrom(rec_size) print("收到来自客户端< %s,%s >的消息" % address, data.decode(‘utf-8‘)) # 发送给客户端消息 s_udp.sendto(data.upper(), address)
基于udp的socket客户端
#udp 客户端 from socket import * rec_size = 1024 ip_port = (‘127.0.0.1‘, 8000) # 创建udp套字节对象 c_udp = socket(AF_INET, SOCK_DGRAM) while True: try: msg = input("发送给服务端的消息: >>> ").strip() if not msg: continue # 给服务端发送消息 c_udp.sendto(msg.encode(‘utf-8‘), ip_port) # 接收服务端的消息 data, address =c_udp.recvfrom(rec_size) print("收到来自服务端的消息:", data.decode(‘utf-8‘)) except Exception: continue
原文:https://www.cnblogs.com/kral-yang/p/12620221.html