게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
파이썬 소켓에서 스레드 관련 조언좀 부탁드립니다,
게시물ID : programmer_21858짧은주소 복사하기
작성자 : 형광젖소(가입:2010-04-26 방문:1255)
추천 : 0
조회수 : 193회
댓글수 : 3개
등록시간 : 2017/12/12 20:24:10
옵션
  • 본인삭제금지
소켓으로 서버에서 클라이언트로 파일을 보내려고 합니다.
프로그램을 GUI없이 그냥 실행하면 send도 recv도 아무런 문제 없이 돌아갑니다.
근데 클래스로 만들어서 GUI에서 실행하면 recv 부분 루프 부분에서 멈춰버리더라구요.

그래서 스레드를 사용하니까 GUI에서도  멈추치는 않는데 
대신 클라이언트가 소켓이 send한 파일을 recv를 하지 못합니다.
클라이언트개 대기중일 때 대기중이라는 메시지를 출력하게 해놓았는데 
대기중이라고 메시지는 정상적으로 출력됩니다만 받지를 못합니다.
send를 추가로 보낼때마다 계속해서 대기중 메시지만 하고 받지를 않습니다.

좀 더 정확히 말씀드리자면 이것저것 살펴본 결과 아래 recvData 메소드에서  
if not data:
break
부분이 작동하지 않는 것 같습니다,
이부분은 아래 코드부분에서 좀더 자세히 말씀드리겠습니다.


서버-클라이언트 연결 이후 보내고 받는 부분 코드는 이렇습니다.
---------서버 클래스 중에서----------(GUI에서 서버 소켓 객체 생성)
def sendData(self, file):	
while True:
filename = file
self.f = open(filename, 'rb')
l = self.f.read(1024)
while (l):
self.client_socket.send(l)
self.sentData = repr(l)
print('Sent ', self.sentData)
l = self.f.read(1024)
self.f.close()
print('Done sending')
self.client_socket.send(b'')
break

---------클라이언트 클래스 중에서----------(GUI에서 클라이언트 소켓 객체 생성)
def file_open(self, file):
self.f = open(file, 'wb')
print('file opened')

def recvData(self,file):	

self.f = open(file, 'wb')
print('file opened')

while True:
        print('receiving data...')
data = self.client_socket.recv(1024)
print('data=', data.decode('utf-8'))
if not data:
self.f.write(data)
self.f.close()
print('Successfully get the file')


----------------------------------------------------

GUI에서 버튼 클릭 시 recvData 메소드를 불러옵니다.

def clientBtn_clicked(self):
self.C_socket.file_open('./text.txt')
	t = threading.Thread(target=self.C_socket.recvData)	
t.start()

-----------------------------------------------------------------------------
혹시 제가 스레드나 다른 부분에서 잘못한 부분이 있을까요??
조언좀 부탁드립니다.
전체 추천리스트 보기
댓글쓰기
리스트 페이지로
데이터절약모드
◀뒤로가기
PC버전
맨위로▲
공지 운영 게시판요청 자료창고