1 # socket编程 2 # 01010 ethernet(你在教室的那个位置)mark ip(教室在哪,主机)子网 tcp,udp(端口)应用程序在哪 3 # 物理层----》数据链路层------------------------》网络层----》 ----------》传输层 --------------------》应用层 4 # Socket抽象层 5 # pid是同一台计算机上不同进程或者线程的标识 6 7 # TCP套接字 8 import socket 9 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立客户端 10 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 重新使用ip地址 11 phone.bind(("127.0.0.1", 8000)) # 绑定唯一的局域网中的一个端口(挂起连接请求) 12 phone.listen(5) # 监听的事件 13 print("----------->") 14 while True: 15 conn, addr = phone.accept() # 就相当于链接,和电话号 16 17 print("conn", conn) 18 print("addr", addr) 19 20 while True: 21 try: 22 msg = conn.recv(1024) # 接收消息 23 print("客户端发来的消息是:", msg.decode("utf-8")) 24 25 conn.send(msg.upper()) 26 except Exception: 27 break 28 conn.close() 29 phone.close()
1 import socket 2 3 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4 phone.connect(("127.0.0.1", 8000)) 5 6 while True: 7 msg = input("====>:").strip() 8 if not msg: 9 continue 10 phone.send(msg.encode("utf-8")) 11 print("客户端已经发送消息!") 12 data = phone.recv(1024) 13 print("收到服务端发来的消息:", data) 14 15 phone.close()
1 # UDP套接字 2 from socket import * 3 import time 4 5 ip_port = ("127.0.0.1", 8080) 6 buffer_size = 1024 7 udp_server = socket(AF_INET, SOCK_DGRAM) # 数据报 8 9 udp_server.bind(ip_port) 10 print("绑定成功") 11 while True: 12 data, addr = udp_server.recvfrom(buffer_size) 13 print("收到客户端的消息:", data) 14 15 if not data: 16 fmt = "%Y-%m-%d %X" 17 else: 18 fmt = data.decode("utf-8") 19 back_time = time.strftime(fmt) 20 21 data = udp_server.sendto(back_time.encode("utf-8"), addr)
1 # UDP套接字 2 from socket import * 3 4 ip_port = ("127.0.0.1", 8080) 5 buffer_size = 1024 6 7 udp_client = socket(AF_INET, SOCK_DGRAM) # 数据报 8 9 while True: 10 # msg = input("----->").strip() 11 msg = input("获取当前服务端时间:") 12 udp_client.sendto(msg.encode("utf-8"), ip_port) # 没有链接。多以需要指定发到哪个ip和端口 13 14 data, addr = udp_client.recvfrom(buffer_size) 15 print("收到服务端的消息:", data.decode("utf-8"))
https://www.cnblogs.com/linhaifeng/articles/6129246.html 关于socket内核
粘包:
# recv在自己的缓冲区为空时,阻塞
# recvfrom在自己的缓冲区为空时就收一个空????
# 粘包其实就是服务端将接收到的消息执行之后,放入自己的缓冲区内,但是由于每次只能接收
# (客户端)一部分导致,下一次输入命令的时候,会把上次为输出完的接着输出,成为粘包。
# 粘包现象只会出现在tcp中而不会出现在udp中,是因为tcp是可靠传输(安全的)会把没有接收完的消息,
# 继续发送;但是udp却是只接收一次(按设置的多少就是多少),缓冲区中的没有发送完的内容,他不会管
# 有没有接受完全,(类似)覆盖掉了。
这里还有一个我看的课程中的作业代码地址有兴趣可以看一看??https://gitee.com/maxhope8/FTP.git