TCP和并发服务器
与UDP不同的是,他是一个面向连接的,可靠的数据传输协议
TCP通信比较复杂
先写一个TCP服务器,一般步骤如下:
1、首先是要创建一个socket套接字:socket()
2、服务器一般是需要一个固定的IP地址和固定端口号,服务器就要绑定这个IP地址和端口号:bind()
3、客户端连接服务器是是有一定的数量(允许最大连接数)的,而这个数量是服务器设定的:listen()
4、上面3步是做被连接的准备,这一步是来接受客户端的数据,在接受数据之前,服务器还是需要接受客户端的socket套接字和IP地址:accept()
5、只有服务器和客户端绑定相同的IP地址,服务器和客户端才可以互相接收数据和发送数据,常理来想,服务器是一只被开启的,也是一直接受数据,所以在接受数据的过程中,我们需要无限循环:recv()
6、如果我们要发送数据给客户端,客户端也需要绑定上面的地址,然后需要调用相应的函数send()
import
socket
#
TCP
#
创建一个服务器socket套接字
server_socket =
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#
服务器的IP地址和端口号
address = (
"
127.0.0.1
"
, 9999
)
#
服务器绑定地址
server_socket.bind(address)
#
设置服务器的最大连接数
server_socket.listen(1
)
#
创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
client_socket, address =
server_socket.accept()
#
服务器需要不停的接受客户端的发来的数据
while
True:
"""
以防客户端连接失败,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
try
:
data
= client_socket.recv(2048).decode(
"
UTF-8
"
)
#
数据处理
print
(
"
服务器接受的数据:
"
, data) # 服务器接受的数据:我是一个客户端
client_socket.send(
"
我是一个服务器
"
.encode(
"
UTF-8
"
))
except
:
break
再写一个TCP客户端,一般步骤如下:
1、首先是要创建一个socket套接字:socket()
2、客户端一般是不需要一个固定的IP地址和固定端口号,连接服务器的时候系统会自动分配端口号
3、客户端连接服务器必须先知道服务器的IP地址和端口号,然后在连接服务器:connect()
4、上面3步是做连接的准备,这一步是来发送客户端的数据:send()
5、客户端也可以一直接受服务器发来的数据,所以在接受数据的过程中,我们需要无限循环:recv()
import
socket
#
客户端需要创建一个套接字
client_socket =
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#
客户端需要连接服务器,必须先知道服务器的IP地址和端口号
address = (
"
127.0.0.1
"
, 9999
)
#
连接服务器
client_socket.connect(address)
#
这个数据是将要发送的数据
data =
"
我是一个客户端
"
client_socket.send(data.encode(
"
UTF-8
"
))
while
True:
"""
以防服务器中断退出,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
try
:
data
= client_socket.recv(2048).decode(
"
UTF-8
"
)
#
数据处理,这里打印出来并且将数据发回客户端
print
(
"
客户端接受的数据:
"
, data)
except
:
break
并发服务器,这里我只介绍多线程服务器,进程和线程是差不多的)
在TCP服务器的原有基础上增加一个线程,再将监听数增加为5,就可以允许5个客户端线程同时访问,并且可同时发送和接受数据
import
socket
from
threading
import
Thread
#
TCP
#
创建一个服务器socket套接字
server_socket =
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#
服务器的IP地址和端口号
address = (
"
127.0.0.1
"
, 9999
)
def
net_connect():
try
:
#
服务器绑定地址
server_socket.bind(address)
#
设置服务器的最大连接数
server_socket.listen(5
)
except
:
return
#
创建线程
th = Thread(target=
recv_data)
th.start()
def
recv_data():
#
服务器需要不停的接受客户端的发来的数据
while
True:
"""
以防客户端连接失败,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
#
创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
client_socket, address =
server_socket.accept()
try
:
data
= client_socket.recv(2048).decode(
"
UTF-8
"
)
#
数据处理
print
(
"
服务器接受的数据:
"
, data)
client_socket.send(
"
我是一个服务器
"
.encode(
"
UTF-8
"
))
except
:
break
net_connect()
在TCP客户端上也增加一个线程,然后同时运行多次这个客户端程序:
import
socket
#
客户端需要创建一个套接字
from
threading
import
Thread
client_socket
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#
客户端需要连接服务器,必须先知道服务器的IP地址和端口号
address = (
"
127.0.0.1
"
, 9999
)
def
net_connect():
try
:
#
连接服务器
client_socket.connect(address)
except
:
return
th
= Thread(target=
recv_data)
#
th.setDaemon(True)
th.start()
def
recv_data():
#
这个数据是将要发送的数据
data =
"
我是一个客户端
"
client_socket.send(data.encode(
"
UTF-8
"
))
while
True:
"""
以防服务器中断退出,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
try
:
data
= client_socket.recv(2048).decode(
"
UTF-8
"
)
#
数据处理,这里打印出来并且将数据发回客户端
print
(
"
客户端接受的数据:
"
, data)
except
:
break
net_connect()

