客户端:
import socket
flag = True
# 生成socket对象
client = socket.socket()
# 链接要链接的ip和port(端口)
client.connect(('localhost', 6666))
# while循环
while flag:
# 获得用户输入
msg = input("Enter your message('q' for quit):").strip()
# 判断是否为空
if len(msg) == 0:
print("Message can't be empty")
continue
# 发送数据
client.send(msg.encode())
# 判断是否为'q'
if msg != 'q':
# 接收数据
data = client.recv(1024)
# 打印接收到的数据
print(data)
else:
# 条件为False
flag = False
# 关闭socket链接
client.close()
print('Server Closed')
服务器端:
import socket
flag = True
# 生成socket对象
server = socket.socket()
# 绑定ip和端口
server.bind(('localhost', 6666))
# 监听绑定的端口
server.listen()
# 方便识别打印一个我在等待
print("I'm waiting the connect...")
# 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
# 所以下面的传输要使用conn实例操作
conn, addr = server.accept()
# 打印链接成功
print('Connect success!')
# 进入循环
while flag:
# 接受数据并赋给data
data = conn.recv(1024).decode()
# 判断
if data != 'q':
# 打印收到数据
print('收到:', data)
# 发送我收到数据了
conn.send('Send Successed!'.encode())
else:
# 条件为False
flag = False
# 关闭socket链接
server.close()
先运行服务器端,后运行客户端:
需要注意的几个点:
编码问题,因为只支持bytes类型数据,每次发送之前要encode()一下,接收之后要decode()一下
服务器端的while判断要放在accept()之后,也就是说不能将accept()放在循环中,如果包进循环中,只能传输一次就会卡住,第二次循环就会再等待连接
不能send空,如果为空的话服务器端recv会一直等待,也就是说客户端什么都不输入直接回车就会卡住,可以通过判断避免这种情况
这里呢是客户端断开服务器端也会断开,这里是我自己写的断开,即使不写,客户端断开服务器端也会断开,可以在accept上再添加一个循环,修改一下服务器端就可以了
import socket
flag = True
# 生成socket对象
server = socket.socket()
# 绑定ip和端口
server.bind(('localhost', 6666))
# 监听绑定的端口
server.listen()
while flag:
# 方便识别打印一个我在等待
print("I'm waiting the connect...")
# 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
# 所以下面的传输要使用conn实例操作
conn, addr = server.accept()
# 打印链接成功
print('Connect success!')
# 进入循环
while flag:
# 接受数据并赋给data
data = conn.recv(1024).decode()
# 判断
if data != 'q':
# 打印收到数据
print('收到:', data)
# 发送我收到数据了
conn.send('Send Successed!'.encode())
else:
print('This connection is broken')
break
# 关闭socket链接
server.close()
这样就实现了客户端断开服务器端不会断开,服务器一直等待客户端连接
转载请注明出处
python自学技术互助扣扣群:670402334
下一篇:socket实现简单ssh客户端
网友评论