完成類似多人聊天室(多房)的功能
This commit is contained in:
parent
1c008e2029
commit
b85bd74f7b
45
main.py
45
main.py
@ -68,6 +68,7 @@ class Server:
|
|||||||
|
|
||||||
class Room:
|
class Room:
|
||||||
startFlag = False
|
startFlag = False
|
||||||
|
sockList = []
|
||||||
def __init__(self,ip,portNum):
|
def __init__(self,ip,portNum):
|
||||||
self.ip = ip
|
self.ip = ip
|
||||||
self.portNum = portNum
|
self.portNum = portNum
|
||||||
@ -80,11 +81,25 @@ class Room:
|
|||||||
sock,sockname = listensock.accept()
|
sock,sockname = listensock.accept()
|
||||||
print("[ {} ]{} has connected.".format(self.portNum,sockname))
|
print("[ {} ]{} has connected.".format(self.portNum,sockname))
|
||||||
sock.send('WELCOME'.encode('utf-8'))
|
sock.send('WELCOME'.encode('utf-8'))
|
||||||
|
|
||||||
|
self.sockList.append(sock) # 把sock放入list
|
||||||
|
|
||||||
|
receiveDataThread = threading.Thread(target=self.receiveData,args=(sock,))
|
||||||
|
receiveDataThread.start()
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
||||||
sock.connect((self.ip,self.portNum))
|
sock.connect((self.ip,self.portNum))
|
||||||
print(sock.recv(MAX).decode('utf-8'))
|
return sock
|
||||||
|
def receiveData(self,sock):
|
||||||
|
while True:
|
||||||
|
data = sock.recv(MAX).decode('utf-8')
|
||||||
|
if data:
|
||||||
|
print(data)
|
||||||
|
for clientSock in self.sockList: # 遍歷socket list
|
||||||
|
if clientSock != sock: # 不是自己的才傳送資料
|
||||||
|
clientSock.send("[{}]:{}".format(sock.getpeername(),data).encode('utf-8'))
|
||||||
|
|
||||||
class Client:
|
class Client:
|
||||||
def __init__(self,ip,port):
|
def __init__(self,ip,port):
|
||||||
@ -106,18 +121,36 @@ class Client:
|
|||||||
print(receiveMsg)
|
print(receiveMsg)
|
||||||
connectData = receiveMsg.split(' ')
|
connectData = receiveMsg.split(' ')
|
||||||
room = Room(self.ip,int(connectData[1]))
|
room = Room(self.ip,int(connectData[1]))
|
||||||
room.connect()
|
sock = room.connect() # sock可覆蓋了
|
||||||
|
|
||||||
|
receiveDataThread = threading.Thread(target=self.receiveData,args=(sock,))
|
||||||
|
receiveDataThread.start()
|
||||||
|
sendDataThread = threading.Thread(target=self.sendData,args=(sock,))
|
||||||
|
sendDataThread.start()
|
||||||
|
|
||||||
elif receiveMsg=="OK.CLIENT":
|
elif receiveMsg=="OK.CLIENT":
|
||||||
roomNum = input("Room Number> ")
|
roomNum = input("Room Number> ")
|
||||||
sock.send(roomNum.encode('utf-8'))
|
sock.send(roomNum.encode('utf-8'))
|
||||||
receiveMsg = sock.recv(MAX).decode('utf-8')
|
receiveMsg = sock.recv(MAX).decode('utf-8')
|
||||||
|
room = Room(self.ip,int(receiveMsg))
|
||||||
|
sock = room.connect() # sock可覆蓋了
|
||||||
|
|
||||||
|
receiveDataThread = threading.Thread(target=self.receiveData,args=(sock,))
|
||||||
|
receiveDataThread.start()
|
||||||
|
sendDataThread = threading.Thread(target=self.sendData,args=(sock,))
|
||||||
|
sendDataThread.start()
|
||||||
|
|
||||||
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
|
||||||
sock.connect((self.ip,int(receiveMsg)))
|
|
||||||
print(sock.recv(MAX).decode('utf-8'))
|
|
||||||
else:
|
else:
|
||||||
print("ERROR TYPE")
|
print("ERROR TYPE")
|
||||||
|
def receiveData(self,sock):
|
||||||
|
while True:
|
||||||
|
data = sock.recv(MAX).decode('utf-8')
|
||||||
|
if data:
|
||||||
|
print(data)
|
||||||
|
def sendData(self,sock):
|
||||||
|
while True:
|
||||||
|
data = input("> ")
|
||||||
|
sock.send(data.encode('utf-8'))
|
||||||
def main():
|
def main():
|
||||||
ip = sys.argv[2]
|
ip = sys.argv[2]
|
||||||
port = sys.argv[3]
|
port = sys.argv[3]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user