网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式。网络可以是逻辑的、本地的电脑网络,或者是可以物理连接到外网的网络,并且可以连接到其它网络。英特网就是一个明显的例子,就是那个你通过 ISP 连接到的网络
Socket 应用最常见的类型就是 客户端/服务器 应用,服务器用来等待客户端的链接。

accept()
方法阻塞并等待传入连接。当一个客户端连接时,它将返回一个新的 socket 对象,对象中有表示当前连接的 conn 和一个由主机、端口号组成的 IPv4/v6 连接的元组
这里必须要明白我们通过调用 accept() 方法拥有了一个新的 socket 对象。这非常重要,因为你将用这个 socket 对象和客户端进行通信。和监听一个 socket 不同的是后者只用来授受新的连接请求
应用程序使用回环地址来与主机上的其它进程通信,这使得它与外部网络安全隔离。由于它是内部的,只能从主机内访问,所以它不会被暴露出去
socket 模块的基本使用
服务端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 65534))
s.listen()
con, addr = s.accept()
print('链接线', con)
print('客户端', addr)
client_msg = con.recv(1024)
print('client msg:', client_msg)
con.send(client_msg.capitalize())
con.close()
s.close()
客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 65534))
s.send(b"hello")
back_msg = s.recv(1024)
print(back_msg)
s.close()
屌丝被小仙女撩了
小仙女
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 65534))
s.listen(3)
while True:
print("开始狩猎")
con, addr = s.accept() # 等待客户端的链接请求
print('链接线', con)
print('客户端地址端口信息', addr)
while True: # 开始撩妹
print('收消息')
client_msg = con.recv(1024)
if not client_msg:
break
print('屌丝说:', str(client_msg, encoding='utf-8'))
send_msg = input("->:")
con.send(client_msg)
print("信息已发送")
con.close()
s.close()
屌丝
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 65534))
while True: # 循环的发送接收消息
send_msg = input('>>:')
if not send_msg:
continue
s.send(bytes(send_msg, encoding='utf-8'))
back_msg = s.recv(1024)
print('小仙女回复我了-》', str(back_msg, encoding='utf-8'))
s.close()
gevent
# pip3 install gevent
import gevent
def eat(arg):
print("点餐...", arg)
gevent.sleep(10)
print("取餐...", arg)
def phone():
print("朋友圈")
gevent.sleep(10)
print("抖音")
g1 = gevent.spawn(eat, 'noodles')
g2 = gevent.spawn(phone)
g1.join()
g2.join()
print("主程序结束")
猴子补丁让 gevent
识别自身之外的阻塞
from gevent import monkey
monkey.patch_all()
import gevent
import time
def eat(arg):
print("点餐...", arg)
time.sleep(10)
print("取餐...", arg)
def phone():
print("朋友圈")
time.sleep(10)
print("抖音")
g1 = gevent.spawn(eat, 'noodles')
g2 = gevent.spawn(phone)
g1.join()
g2.join()
print("主程序结束")
网友评论