python tcp协议下的一对一聊天
  TEZNKK3IfmPf 2023年11月14日 22 0

 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的程序。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   32   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
  TEZNKK3IfmPf   2024年05月31日   34   0   0 excelpython
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
TEZNKK3IfmPf