Tcp的基本概念就不错说了,主要介绍一下python的socket使用。
服务器
需要绑定一个端口并开始监听其他客户端连接。
import socket
import threading
def thread_fun(sock,addr):
print('accept new client from %s:%s' % (sock, addr))
sock.send('hello'.encode('utf-8'))
while True:
try:
data = sock.recv(1024)
if not data or data.decode('utf-8') == 'quit':
break
#接受到 加个头返回去
sock.send(('hello %s' % data.decode('utf-8')).encode('utf-8'))
except OSError:
print('client close %s:%s' % (sock, addr))
return None
print('client %s:%s quit' % (sock, addr))
sock.close()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 10000)) #绑定一个Ip和端口
s.listen(5) #监听队列长度为5
print('server run waiting for connection...')
while True:
try:
#等待一个新连接
sock, addr = s.accept()
#创建线程处理连接
thread = threading.Thread(target=thread_fun, args=(sock,addr))
thread.start()
except OSError:
pass
客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接
s.connect(('127.0.0.1', 10000))
# 接受服务器消息
print(s.recv(1024).decode('utf-8'))
for data in [b'Bob', b'Jack', b'Rose']:
# 发送数据
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'quit')
结论
打印消息如下
#客户端
hello
hello Bob
hello Jack
hello Rose
#服务器
server run waiting for connection...
accept new client from <socket.socket fd=216, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 10000), raddr=('127.0.0.1', 51335)>:('127.0.0.1', 51335)
client <socket.socket fd=216, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 10000), raddr=('127.0.0.1', 51335)>:('127.0.0.1', 51335) quit
用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。通常,服务器程序会无限运行下去。
同一个端口,被一个Socket绑定了以后,就不能被别的Socket绑定了。