TCP编程
- Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络连接”
- 客户端大多数连接都是靠TCP连接。主动发起连接的叫客户端(client),被动响应连接的叫服务器(server)
TCP服务器的建立
- 创建socket
- 绑定socket的ip地址和端口
- 监听客户端的连接请求
- 接受客户端的连接请求
- 与客户端对话
- 关闭连接
TCP客户端的创建
- 创建socket
- 连接服务器socket
- 与服务器对话
- 关闭连接
- TCP客户端连接到服务器的ip和端口要与TCP服务器监听的ip和端口相同。
- 服务器调用listen()开始监听端口,而后调用accept()时刻准备接受客户端的连接请求。
- 此时服务器处于阻塞状态,直到服务器监听到客户端的请求后,接收请求并建立连接为止。
server
import socket
import threading
import time
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')) # 将收到的数据先解码,然后hello,%data一起编码
sock.close()
print('connection from %s:%s closed.' % addr)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',12345)) # 监听端口
s.listen(5) # 开始监听端口 传入的参数指定等待来连接的最大数量
print('waiting for connection...')
while True:
# 接受一个新连接
sock, addr = s.accept()
# 创建新线程来处理TCP连接
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
# 打印结果
# waiting for connection...
# accept new connection from 127.0.0.1:54861
# connection from 127.0.0.1:54861 closed.
client
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 建立连接
s.connect(('127.0.0.1', 12345))
# 接收欢迎消息
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Kobe']:
# 发送数据
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
# 打印结果
# welcome!
# hello,Michael!
# hello,Tracy!
# hello,Kobe!
- UTF-8是一种变长的编码方式,它使用1-4个字节表示一个符号,根据不同的符号选择不同长度的字节表示
- decode()以 encoding 指定的编码格式解码字符串
- encode()以 encoding 指定的编码格式编码字符串。