zoukankan      html  css  js  c++  java
  • 简易的聊天

    基于TCP:

    import socket
    
    sk = socket.socket()
    
    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  # 有了这段代码就可重复使用端口了。
    
    sk.bind(('127.0.0.1',9000))
    
    sk.listen() # 可以加参数,表示同一个时间可以有n个链接等待与server端通信
    
    while True:
        conn,addr = sk.accept()     # 接收 连接的客户端的连接
        while True:
            ret = conn.recv(1024).decode('utf-8')   # 将接受的内容解码
            if ret.upper() == 'Q':break
            print(ret)
            inp = input('>>>')
            conn.send(inp.encode('utf-8'))
            if inp.upper() == 'Q':break
        conn.close()
    sk.close()
    服务器
    import socket
    
    sk = socket.socket()
    
    sk.connect(('127.0.0.1',9000))
    while True:
        inp = input('>>>')
    
        sk.send(inp.encode('utf-8'))
    
        if inp.upper() == 'Q': break
    
        ret = sk.recv(1024).decode('utf-8')
    
        if ret.upper() == 'Q':break
    
        print(ret)
    
    sk.close()
    客户端

    基于UDP:

    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    sk.bind(('127.0.0.1',9000))
    
    while True:
    
            msg,addr = sk.recvfrom(1024)
    
            print(msg.decode('utf-8'))
    
            inp = input('>>>')
    
            sk.sendto(inp.encode('utf-8'),addr)
    
    sk.close()
    服务器
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
        inp = input('>>>')
    
        if inp.upper() == 'Q':break
    
        sk.sendto(inp.encode('utf-8'),('127.0.0.1',9000))
    
        msg,addr = sk.recvfrom(1024)
    
        print(msg.decode('utf-8'))
    
    sk.close()
    客户端

      进阶(加上客户端的名称以及上色):

    import socket
    
    lst = {'顾清秋':'33[1;31m','顾小白':'33[1;34m'}  # 可以根据客户端发来的姓名选择相应的颜色
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    sk.bind(('127.0.0.1',9000))
    
    while True:
    
            msg,addr = sk.recvfrom(1024)
    
            name,mesg = msg.decode('utf-8').split(':')      # 将姓名与发送的内容分割,提取姓名
    
            color = lst.get(name.strip(),'')
    
            print('%s%s33[0m ' % (color,msg.decode('utf-8')))
    
            inp = input('>>>')
    
            sk.sendto(inp.encode('utf-8'),addr)
    
    sk.close()
    服务器
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    name = input('请输入你的名字:')    # 输入名字
    
    while True:
        inp = input('>>>')
    
        if inp.upper() == 'Q':break
    
        sk.sendto(('%s:%s' % (name,inp)).encode('utf-8'),('127.0.0.1',9000)) # 将姓名和内容按格式发送过去
    
        msg,addr = sk.recvfrom(1024)
    
        print(msg.decode('utf-8'))
    
    sk.close()
    客户端

      再次进阶(由于每次信息都需要编码解码,所以化简):

    from socket import *
    class Mysocket(socket):
        def __init__(self,coding = 'utf-8'):
            self.coding = coding
            super().__init__(type=SOCK_DGRAM)
    
        def my_recv(self,num):
            msg,addr = self.recvfrom(num)
            return msg.decode(self.coding),addr
    
        def my_send(self,msg,addr):
            return self.sendto(msg.encode(self.coding),addr)
    my_socket
    from my_socket import Mysocket
    
    sk = Mysocket()
    
    sk.bind(('127.0.0.1',9000))
    
    while True:
    
        msg,addr = sk.my_recv(1024)
    
        print(msg)
    
        inp = input('>>>')
    
        sk.my_send(inp,addr)
    
    sk.close()
    服务器
    from my_socket import Mysocket
    
    sk = Mysocket()
    
    while True:
    
        inp = input('>>>')
    
        if inp.upper() == 'Q':break
    
        sk.my_send(inp,('127.0.0.1',9000))
    
        msg,addr = sk.my_recv(1024)
    
        if msg.upper() == 'Q':break
    
        print(msg)
    
    sk.close()
    客户端

      通过服务器客户端获取实时时间:

    import time
    
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    sk.bind(('127.0.0.1',9000))
    while True:
        msg,addr = sk.recvfrom(1024)
    
        # print(msg.decode('utf-8'))
    
        sk.sendto(time.strftime('%x %X').encode('utf-8'),addr)
    
    sk.close()
    服务器
    import time
    
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
    
        sk.sendto(b'time:',('127.0.0.1',9000))
    
        msg,addr = sk.recvfrom(1024)
    
        print(msg.decode('utf-8'))
    
        time.sleep(1)
    
    sk.close()
    客户端
  • 相关阅读:
    godaddy掉包抽风实况记录
    多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成
    Godaddy空间访问过慢 或是联通/网通运营商限制
    A4纸网页打印中对应像素的设定和换算
    lnmp下 nginx服务器 shopex 安装 出现502 Bad Gateway
    时代互联域名管理后台增加二级域名的方法
    简单的会员系统
    图文讲解如何在godaddy注册的域名如何修改DNS指向
    距离计算方法总结
    今天开始学模式识别与机器学习Pattern Recognition and Machine Learning 书,章节1.1,多项式曲线拟合(Polynomial Curve Fitting)
  • 原文地址:https://www.cnblogs.com/stfei/p/8991380.html
Copyright © 2011-2022 走看看