python tcp协议下的一对一聊天
server.py
import socket
#host=socket.gethostname()
#这是获取本机的主机名,查询本机主机名
#port=12345
#指定端口号,服务器和客户端需要一致
ip = '192.168.1.101'
#服务器的ip地址,socket 套接字可以使用两种实例连接,一个为主机名,一个为ip地址,但都需要指定端口
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#指定是tcp连接,socket_STREAM为tcp模式,socket_DGRAM为udp模式
s.bind((ip,12345))
#套接字绑定ip地址和端口号.
s.listen(2)
#监听数量2,亦即两个客户端可以连接。一对多,等于是服务器可以广播消息了,但客户端无此功能
sock,addr = s.accept()
#参数准备好了,开始接受客户端连接
print('客户端已连接')
info = sock.recv(1024).decode()
#通过sock接收数据,一次最多接收1024字节数据,并将数据解码
while info != 'exit':
#当接收到客户端发送的字符串不是是exit时,执行以下逻辑判断
#如果客户端发送了exit,服务器将关闭。
if info:
print('收到客户端的消息为: %s' % info)
#如果收到信息,打印该信息
send_msg = input('请输入,服务器的消息为:')
sock.send(send_msg.encode())
#服务器向客户端发送消息,并将消息编码,默认为utf-8,因为Python3默认为utf-8
if info == 'quit':
print('服务器即将关闭')
break
try:
if send_msg == 'exit':
print('服务器已关闭')
break
except ConnectionAbortedError as e:
print(e)
try:
if send_msg == 'quit':
print('客户端已关闭,请输入exit,以退出服务器')
except ConnectionAbortedError as e:
print('服务端已经安全退出')
info = sock.recv(1024).decode()
sock.close()
s.close()
client.py
import socket
s=socket.socket()
host='adminsss-PC'
ip='192.168.1.101'
port=12345
s.connect((ip,port))
print('已连接服务器,服务器的IP为:%s'%ip)
info = ''
while info != 'quit':
send_msg = input('本机输入内容:')
s.send(send_msg.encode())
if info == 'quit':
print('客户端关闭了')
if info == 'exit':
print('客户端即将关闭')
break
if send_msg == 'quit':
print('客户端立刻关闭了')
break
if send_msg == 'exit':
print('服务器崩溃了,因为是exit,请使用quit退出客户端')
try:
info = s.recv(1024).decode()
print('本机接收的服务器信息为: %s' % info)
except ConnectionAbortedError as e:
print('远程连接已关闭,请关闭客户端程序')
s.close()
一般这样的编程叫c/s编程,为了方便,我在这里暂称呼服务端为s,客户端端为c,s中的循环条件为c发送exit字符串,c中的循环条件为s发送quit字符串,c的发送等于s的接收,c发送quit等于s接收到了quit,但c是关闭的,s是等待的。算了,这么说吧,c和s两端的开闭由exit和quit的发送或者接收决定,这构成了比较复杂的逻辑,我这么编写的程序有问题吗?逻辑上可以跑通,但,我好像解释不了。有人能看出我的破绽吗???
大体程序运行流程:首先,启动服务器,等待客户端连接,然后客户端连接,客户端发送消息,服务器接收到消息,然后回复消息,等于一问一答形式。两端都有触发开闭的字符串,c端使用quit,s端使用exit,
如果c端发送exit,那么s端关闭,c仍然开启。
如果c端发送quit,s仍然开启,c关闭,
如果s端发送exit,报错,双端推出
如果s端发送quit,c端推出,s仍然开启,exit退出s。
s的发送等于c的接收,c的接收等于s的发送。就这样,。毫无疑问,应该是有细微bug的程序。