网络编程很常用,很底层,实际上,http协议,也是建立在网络编程上的,只是说这一层,由nginx或者是apache实现了。在工作当中,在网关设备之间传输数据的时候,就用到了网络编程,刚开始写的程序部署服务器后很不稳定,客户端异常或者是断开连接,服务端就会断开,或者是阻塞,不能再接受到客户端的信息,或者是处理多个客户端连接时候没有好的方案,出了不少问题,现在总结下这些问题。
服务端
#只要一个客户端连上,就能一直接受客户端的消息,是一个长连接
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
config = ("0.0.0.0",6002)
server.bind(config)
server.listen(5)
# 阻塞,等待(监听)连接,等有客户端连接之后才会往下执行
con,addr = server.accept()
while True:
print("Client has link the server...")
try:
#阻塞,等待(监听)接受数据,收到数据之后才会往下执行
msg = con.recv(1024)
print(msg)
con.send(b"this is from tcp_server")
except Exception as e:
#如果客户端断开,那么,报错,打破while的循环,否则一直while
print("has stop")
con.close()
break
客户端
# 给tcp服务器发送5次消息
import socket
import time
count = 0
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
config = ("192.168.101.67",6002)
client.connect(config)
while count < 5:
client.send(b"this is from client")
#到recv()阻塞,等待接受数据,接收到之后接续执行
print(client.recv(1024))
count+=1
time.sleep(1)
服务端多线程,一个tcp服务不可能仅仅只解决一个客户端的请求,如果按照上面的代码,那么,若两个客户端同时连接了,那么,只有在A客户端的连接关闭之后,另一个客户端B的阻塞才能终止,也才能和B客户端通信。如果才能够多个客户端连上tcp server后,都互不影响,各自做各自的工作呢——这就想到了多线程了。
import socket
import os
import threading
#得到socket
class get_server_socket():
def __init__(self,ip,port):
self.port = port
self.ip = ip
def get_socket(self):
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
config = (self.ip,self.port)
server_socket.bind(config)
server_socket.listen(10)
print("Waiting for client connect...")
return server_socket
#多线程监听客户端连接
class get_msg(threading.Thread):
def __init__(self,socket,num):
super(get_msg,self).__init__()
self.socket = socket
self.num = num
def spy_client(self):
# 每一个链接都需要创造一个线程,不然当一个线程连接上时候,其他的会阻塞
con,addr = self.socket.accept()
while True:
recv = con.recv(1024)
con.send(b"This is reply from server port")
print(recv)
print("Current thread number is {}".format(threading.activeCount()))
def run(self):
try:
self.spy_client()
except Exception as e:
#如果客户端主动断开或者那个线程错误,那么,继续延续,防止线程用完
self.spy_client()
serverSocketInstance = get_server_socket("0.0.0.0",6001)
serverSocket = serverSocketInstance.get_socket()
thread_num = 3
for x in range(0,thread_num):
tmp = get_msg(serverSocket,x+1)
tmp.start()
服务端io复用
新同事所得工具(twisted)