建立Python的服务端
类似于java的tcp协议,Python中的服务端建立方式类似
首先需要导入socket类
import socket
from time import ctime#导入时间类
建立套接字,绑定IP地址和端口,设置最大连接数
创建了一个socket对象。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。AF_INET表示创建的是ipv4的类型。
"""
@version: v1.0
@author: jerrygaoling
@site: ${SITE}
@file: $test_python_sever.py
@time: 2018.03.10
"""
if __name__=="__main__":
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建套接字
sock.bind(('localhost', 8081)) #配置soket,绑定IP地址和端口号
sock.listen(1) #设置最大允许连接数,各连接和server的通信遵循FIFO原则
print ("Server is listenting port 8081, with max connection 1")#给定输出提示性语句。
循环监听端口
不断接收请求:收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
accept()方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
while True: #循环轮询socket状态,等待访问
connection,address = sock.accept()
注意!!:当为多线程时,需要进行多线程编写,本文只是单线程连接。
try:
connection.settimeout(50)#设置定时时间
#获得一个连接,然后开始循环处理这个连接发送的信息
while True:
try:
buf = connection.recv(1024).decode()
if not buf:
break
print (buf)
if buf == '1':
print ("send welcome")
connection.send(('[%s] %s' % (ctime(),"welcome,glyz的学习记录")).encode())
elif buf=='2':
connection.send(('[%s] %s' % (ctime(),"我的学习记录!")).encode())
print ("send refuse")
else:
print ("close")
break #退出连接监听循环
except socket.error:
print ("get connect error,lost_client")#当连接失败时,捕捉异常并退出,继续监听。
break
except socket.timeout: #如果建立连接后,该连接在设定的时间内无数据发来,则time out
print ("time out")
print ("closing one connection") #当一个连接监听循环退出后,连接可以关掉
connection.close()
注意:在Python3.x以上,使用send()方法进行交互传送数据的时候,不能够直接send(”类似于这样的数据”),需要使用上述代码中的格式,使用encode()方法进行转换。否则会报出a bytes-like object is required, not ‘str’的错误。
需要使用encode()方法将bytes类型转换为str类型。使用recv()方法接收数据时,也同样需要使用decode()来转换。
注:代码以按照严格的Python格式进行排版。可直接使用
附上测试用客户端代码
import socket
import time
if __name__=="__main__":
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8081)) #设置连接IP地址与端口
flag = '1'
sock.send(flag.encode())
'''#以下代码为循环访问服务器给出数据请求
print (type(flag))
while True:
time.sleep(3)
print ('send to server with value: '+ flag)
sock.send(flag.encode())
print (sock.recv(1024).decode())
flag = (flag=='1') and '2' or '1' #change to another type of value each time
'''
sock.close()
运行结果:
启动服务器
打开客户端,循环发送、接收数据: