本文代码转自廖雪峰老师的python教程
网络编程底层其实就是一个socket,代表两台机器之间的一个连接。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)AF_INET
指定使用IPv4协议,SOCK_STREAM
指定使用面向流的TCP协议
提供服务的一方是服务端,服务端程序需要绑定(s.bind())一个端口,然后长期监听(s.listen())这个端口,收到消息(s.accept())后给予相应反馈。
反馈消息是通过新启动一个线程来实现的,这样就可以实现对同时刻多个访问的反馈。
tcp_server.py
import socket import threading import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('*.*.*.*', 9999)) s.listen(5) print('Waiting for connection...') def tcplink(sock, addr): print('Accept new connection from %s:%s...' % addr) sock.send(b'Welcome!') while True: data = sock.recv(1024) time.sleep(1) if not data or data.decode('utf-8') == 'exit': break sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8')) sock.close() print('Connection from %s:%s closed.' % addr) while True: # 接受一个新连接: sock, addr = s.accept() # 创建新线程来处理TCP连接: t = threading.Thread(target=tcplink, args=(sock, addr)) t.start()
发送消息的一方是客户端,客户端同样要建立一个socket,尝试对服务端进行连接(s.connect(),需要知道服务端的ip和端口);
建立连接之后,发送消息(s.send()),同时也可以从服务端获取消息(s.recv());
完成任务后将连接进行关闭。
tcp_client.py
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('*.*.*.*', 9999)) # 接收欢迎消息: print(s.recv(1024).decode('utf-8')) for data in [b'Michael', b'Tracy', b'Sarah']: # 发送数据: s.send(data) print(s.recv(1024).decode('utf-8')) s.send(b'exit') s.close()