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