虽说语言变成了python,但是socket的基本框架还是在的。首先,我们还是要看一下UNIX环境下的TCP框架
接着直接来看程序,打开你的IDLE,我们先来看server端:
import socket # 导入socket库 import time # 导入time库 HOST = 'localhost' # 连接本地服务器 PORT = 8001 # 设置端口号 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 选择IPv4地址以及TCP协议 sock.bind((HOST, PORT)) # 绑定端口 sock.listen(5) # 监听这个端口,可连接最多5个设备 while True: connection, address = sock.accept() # 接受客户端的连接请求 try: connection.settimeout(10) # 设置10s时限 buf = connection.recv(1024) # 接收数据实例化 if buf: # 接收成功 print('connection success!') connection.send(b'welcome to server!') # 发送消息,b为bytes类型 else: # 接收失败 connection.send(b'please go out!') except socket.timeout: # 超时 print ('time out') connection.close() # 关闭连接
再看client端,比server端更简单:
import socket import time HOST = 'localhost' PORT = 8001 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) time.sleep(2) sock.send(b'1') # 发送信息 print (sock.recv(1024).decode()) # 打印接收消息,并且译码 sock.close() #关闭连接
然后我们先运行server端,让其处于等待接收的状态
接着运行client端,我们分别来看两个IDLE窗口的运行结果
既然复杂的TCP我们都可以写了,那UDP就更不在话下了。
我们只要在原来的代码上进行修改就行:
server端:
import socket HOST = 'localhost' PORT = 8001 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((HOST, PORT)) while True: buf, address = sock.recvfrom(1024) if buf: print('connection success!') sock.sendto(b'welcome to server!',address) else: sock.sendto(b'please go out!',address) sock.close()
client端:
import socket import time HOST = 'localhost' PORT = 8001 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect((HOST, PORT)) time.sleep(2) sock.send(b'1') print (sock.recv(1024).decode()) sock.close()
c语言的socket编程版本请看我之前的博客。