2014-10-18 2 views
0

소켓, select 및 tkinter를 사용하여 채팅 시스템을 만들었지 만 클라이언트가 다시 시작되면 서버를 다시 시작할 때까지 다시 연결하지 못합니다. 다시 시작한 후 Python 소켓 클라이언트가 충돌 함

클라이언트 코드 :

from tkinter import * 
import tkinter.scrolledtext as tkst 
import socket 
import threading 
import time 


class myChatProgram(threading.Thread): 
    def __init__(self): 
     self.root = Tk() 
     self.myFrame = Frame(master = self.root) 
     self.myFrame.pack(fill='both', expand='yes') 
     self.chatArea = tkst.ScrolledText(
     master = self.myFrame, 
     wrap = WORD, 
     width = 50, 
     height = 20 
     ) 
     self.chatArea.configure(state='disabled') 
     self.chatArea.pack(padx=10, pady=10, fill=BOTH, expand=True) 
     self.bottomFrame = Frame(master = self.root) 
     self.bottomFrame.pack(fill='x', expand='yes' , side = "bottom") 
     self.entryBox = Entry(self.bottomFrame) 
     self.entryBox.pack(padx=10, pady=10,fill='x', expand='yes' , side = "left") 
     self.entryButton = Button(self.bottomFrame, text = "Send", command = self.sendText ,padx=10) 
     self.entryButton.pack(side = "right") 
     self.host = '192.168.1.150' 
     self.port = 50003 
     threading.Thread.__init__(self) 
     self.start() 
     self.root.mainloop()  

    def addText(self,message): 
     if message != "": 
     self.chatArea.configure(state='normal') 
     self.chatArea.insert(END, str(message) + "\n") 
     self.chatArea.configure(state='disabled') 

    def sendText(self): 
     message = bytes(self.entryBox.get(),"utf-8") 
     self.addText(self.entryBox.get()) 
     if message: 
      self.mySocket.send(message) 
      self.entryBox.delete(0, END) 


    def run(self): 
     self.mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.mySocket.connect((self.host,self.port)) 
     time.sleep(1) 
     while True: 
      self.addText(str(self.mySocket.recv(4096).decode("utf-8"))) 
myClass = myChatProgram() 

와 서버 코드는 다음과 같습니다

import socket 
import select 
import threading 

class server(threading.Thread): 
    def __init__(self): 
     host = '192.168.1.150' 
     port = 50003 
     self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     self.server.bind((host,port)) 
     print("Your ip is {0} ".format(socket.gethostbyname(socket.gethostname()))) 
     self.server.listen(5) 
     self.sockets = [] 
     self.sockets.append(self.server) 
    def main(self): 
     while True: 
      inputList , outputList , errorList = select.select(self.sockets, [], self.sockets) 
      for mySocket in inputList: 
       if mySocket == self.server: 
        newClient , addr = self.server.accept() 
        print(addr , " Connected") 
       self.sockets.append(newClient) 
       else: 
        try: 
         data = mySocket.recv(4096) 
         if data: 
          self.broadcast(mySocket,data) 
         else: 
          print("Connection sent 0 bytes.") 
          mySocket.close() 
          self.sockets.remove(mySocket) 
        except socket.error , e: 
         print("Client disconnected while sending message.") 
         mySocket.close() 
         self.sockets.remove(mySocket) 
         continue 
      for mySocket in errorList: 
       print("Select flagged client as crashed.") 
       mySocket.close() 
       self.sockets.remove(mySocket) 
       continue 


    def broadcast(self,mySocket,message): 
     print("sending {0}".format(message)) 
     for client in self.sockets: 
      if client != mySocket and socket != self.server: 
       try: 
        client.send(bytes(message,"utf-8")) 
       except: 
        client.close() 
        self.sockets.remove(client) 
        continue 

myClass = server()   
myClass.main() 

다음은 오류 :이 클라이언트가 다시 시작하지 않는 한 잘 작동하지만

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner 
    self.run() 
    File "F:\Sockets\chatClient.py", line 49, in run 
    self.mySocket.connect((self.host,self.port)) 
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it 

그러면 충돌이 발생합니다. 어떤 아이디어가 잘못 되었나요?

+0

실제 문제는 무엇인가? –

+0

여기에 오류를 게시하면 좋을 것입니다. –

답변

0

난 당신이 SO_REUSEADDR을 설정해야 같아요

socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
+0

해당 줄은 서버 코드에 있습니다. –

관련 문제