4.3 TCP服务端搭建

 TCP通信要明白的“三次握手”,“四次挥手”在前面章节以详细说明了,其实在实际的开发过程中,并不需要过多的去关注整个TCP通信建立的过程,你所使用的后端语言,都已经将通信的过程封装成一个个函数,只需要学会如何使用这些函数,去完成相应的功能即可。
基于python 语言的TCP服务器搭建,一般分为一下几个步骤:

1
2
3
4
5
6
7
8
9
10
11
# 导入socket模块包From socket import * 
#创建sockettcp_server_socket = socket(AF_INET,SOCK_STREAM) # 本地信息address=('',8000)
# 绑定
tcp_server_socket.bind(address)
tcp_server_socket.listen(128)
client_socket,clientAddr=tcp_server_socket.accept()
while True:
recv_data = client_socket.recv(1024) # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))
client_socket.send("thank you !".encode('gbk')) # 向客户端发送数据
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接client_socket.close()

 执行上述代码,可以创建个简单的TCP 服务端,但是该服务端是单线程的,也就是说这个服务端启动后,同一时间如若有多个客户端同时访问,只会一个一个进行处理,前面的没有释放连接,后面的连接就只能等待。这是很致命的,对于单线程的服务端,不及时释放,就会影响到其他客户端访问。所以,在实际应用中,TCP服务端都做的是多线程的,可以同时处理多个客户端的请求。
#####多线程TCP服务端设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 # 导入模块包
from socket import *
import json
import threading
from pymysql import *
import datetime
socket_serverlist=[]
# 发送套接字
def send_socket(client_socket):
while True:
data=input("PLEASE INPUTE")
client_socket.send(data.encode('gbk'))
# 接收处理套接字内容,并存入mysql数据库
def recv_socket(client_socket,cs1,conn):
while True:
recv_data = client_socket.recv(1024)
try:
r_data = recv_data.decode('utf8')
j_data = json.loads(r_data)
except Exception as f:
print(f)
continue
print('recv_data is:%s' % r_data)
now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
mac=j_data['addr']
name="mesh_"+mac[12:14]+mac[15:17]
print("name is %s"%name)
date=str(j_data['data'])
sql='insert into device_history_data values ("0","'+name+'","'+mac+' ","'+date+' "," '+ now_time+'")'
count = cs1.execute(sql)
conn.commit()
if recv_data:
client_socket.send(r_data.encode('utf8'))
print('send_data is: COMD ok')
print(threading.active_count())
else:
break
client_socket.close()
#创建多线程
def creat_socket(tcp_server_socket,cs1,conn):
while True:
print("waite client onload")
client_socket, clientAddr = tcp_server_socket.accept()
print("client ID:%s" % str(clientAddr))
client_socket.settimeout(10)
t = threading.Thread(target=recv_socket, args=(client_socket, cs1,conn))
socket_serverlist.append(t);
t.start()
print(socket_serverlist)

#主函数
def main():
#创建套接字
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
#绑定服务器ip,端口
address = ('', 8000)
tcp_server_socket.bind(address)
#连接mysql数据库
conn = connect(host='192.168.1.128', port=3306, database= 'mesh_device _data', user='root', password='mysql', charset='utf8')
cs1 = conn.cursor()
tcp_server_socket.listen(128)
#创建多线程
creat_socket(tcp_server_socket,cs1,conn)
if __name__ == '__main__':
main()