#Python3实现简单客服端和服务器**

##              				 **Python实现简单客服端和服务器**

1.实时聊天:

  • 客户端加上input,加上死循环
  • 服务器直接转发收到的信息
  • 服务器的收发部分做了循环处理,客户端和服务器持续通信
    2.多个客户端无法同时和服务器通信,原因:服务器只要和客户端建立了连接,就无法等待其他客户端
  • 服务器端多线程,只需要将循环聊天的部分多线程
    3.每个客户端只能看到自己说的话。
  • 收到一个客户端向所有人发
  • 得到所有人的管道,向所有人发
    4.目前是客户端发送后才能接收,目的是:收和发是单独的,不互相影响的
  • 多线程:发数据和收数据分别是一个线程
    5.优化:
  • 192.168.60.12: hello
    6.如果有客户端已经断开连接了,服务器列表里还有,s.send会报错
  • 异常处理

servers.py

#导入模块
import socket
import threading
#实例化socket对象,创建管道
s=socket.socket()
#绑定服务器ip和端口
s.bind(("localhost",554))
#监听
s.listen(5)
#创建函数,传入接受管道和地址
def talk(sock,addr):
    while True:
        #当管道关闭时,不能再接受数据,捕获异常,跳出整个whil循环,不让其再执行下面语句!
        try:
            #定义一个变量用来接受返回回来的地址!
            number="\n"+str(addr[0])+": "
            #接受数据
            mgs=sock.recv(1024)
        except:
            break
        #捕获异常
        try:
            #循环遍历socklist,向已连接的返回消息
            for i in socklist:
                i.send(mgs)
                #信息存入文件
                f=open("d:\\infor.txt","a+")
                f.write(number+mgs.decode('gbk'))
                f.close()
        except:
            #捕获到异常时,删除当前管道
            socklist.remove(i)
#创建一个列表用于存放接受的管道
socklist=[]
#
while True:
    #等待链接,返回值为一对
    sock,addr=s.accept()
    #每接受一个管道,就存放在列表中
    socklist.append(sock)
    #创建分线程
    t=threading.Thread(target=talk,args=(sock,addr))
    #启动线程
    t.start()

client.py

#导入包,开始创建客服端
import socket
import threading
#实例化socket,创建管道!
s=socket.socket()
#链接地址和端口
s.connect(("localhost",554))
#定义一个变量接受用户输入,创建用户名!
name=input("请输入你的用户名:\n")

def send(sock,name):
    while True:
        #定义一个变量接受用户输入信息
        userinput=input("请输入:\n")
        #发送数据!
        sock.send((name+":"+userinput).encode("gbk"))
def acc(sock):
    while True:
        #接受数据
        mgs=sock.recv(1024)
        print(mgs.decode('gbk'))
#创建两个线程,同时运行发送数据和接受数据!
threading.Thread(target=send,args=(s,name)).start()
threading.Thread(target=acc,args=(s,)).start()

对上述封装

client.py

import socket
import threading
class Myclinet:
    def __init__(self,ip="localhost",port=554):
        self.__s=socket.socket()
        self.__ip=ip
        self.__port=port
        self.__s.connect((self.__ip,self.__port))
        self.__name=input("请输入你的用户名")

    def __send(self):

        while True:
            __userinput=input("请输入:\n")
            self.__s.send((self.__name+":"+__userinput).encode("gbk"))
    def __acc(self):
        while True:
            #接受数据
            mgs=self.__s.recv(1024)
            print(mgs.decode('gbk'))
    def Start(self):
        threading.Thread(target=self.__send).start()
        threading.Thread(target=self.__acc).start()
myclient=Myclinet()
myclient.Start()

server.py

mport socket
import threading
class Myserver:
    def __init__(self,ip="localhost",port=554):
        self.__s=socket.socket()
        self.__ip=ip
        self.__port=port
        self.__s.bind((ip,port))
        self.__s.listen(5)
        self.__socklist=[]
    def __talk(self,sock,addr):
        while True:
            try:
                number="\n"+str(addr[0])+": "
                mgs=sock.recv(1024)
            except:
                break
            try:
                for i in self.__socklist:
                    i.send(mgs)
                    f=open("d:\\infor.txt","a+")
                    f.write(number+mgs.decode('gbk'))
                    f.close()
            except:
                self.__socklist.remove(i)
    def Start(self):
        while True:
            sock,addr=self.__s.accept()
            self.__socklist.append(sock)
            t=threading.Thread(target=self.__talk,args=(sock,addr))
            t.start()

myserver=Myserver()
myserver.Start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值