<pre style="font-family:'굴림체';font-size:9pt;">소켓으로 서버에서 클라이언트로 파일을 보내려고 합니다.</pre><pre style="font-family:'굴림체';font-size:9pt;"><span style="font-size:9pt;">프로그램을 GUI없이 그냥 실행하면 send도 recv도 </span>아무런 문제 없이 돌아갑니다.</pre><pre style="font-family:'굴림체';font-size:9pt;"><span style="font-size:9pt;">근데 클래스로 만들어서 GUI에서 실행하면 </span>recv 부분 루프 부분에서 멈춰버리더라구요.</pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;">그래서 스레드를 사용하니까 GUI에서도 멈추치는 않는데 </pre><pre style="font-family:'굴림체';font-size:9pt;">대신 클라이언트가 소켓이 send한 파일을 recv를 하지 못합니다.</pre><pre style="font-family:'굴림체';font-size:9pt;">클라이언트개 대기중일 때 대기중이라는 메시지를 출력하게 해놓았는데 </pre><pre style="font-family:'굴림체';font-size:9pt;">대기중이라고 메시지는 정상적으로 출력됩니다만 받지를 못합니다.</pre><pre style="font-family:'굴림체';font-size:9pt;">send를 추가로 보낼때마다 계속해서 대기중 메시지만 하고 받지를 않습니다.</pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;">좀 더 정확히 말씀드리자면 이것저것 살펴본 결과 아래 recvData 메소드에서 </pre><pre style="font-family:'굴림체';font-size:9pt;"></pre><pre style="font-size:9pt;font-family:'굴림체';"><span style="color:#000080;font-weight:bold;">if not </span>data:<br><span style="color:#000080;font-weight:bold;">break<br></span></pre><pre style="font-family:'굴림체';font-size:9pt;">부분이 작동하지 않는 것 같습니다,</pre><pre style="font-family:'굴림체';font-size:9pt;">이부분은 아래 코드부분에서 좀더 자세히 말씀드리겠습니다.</pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;">서버-클라이언트 연결 이후 보내고 받는 부분 코드는 이렇습니다.</pre><pre style="font-family:'굴림체';font-size:9pt;">---------서버 클래스 중에서----------(GUI에서 서버 소켓 객체 생성)</pre><pre style="font-family:'굴림체';font-size:9pt;"></pre><pre></pre><div style="font-family:'굴림체';font-size:9pt;"><pre style="font-family:'굴림체';font-size:9pt;">def <span style="font-size:9pt;">sendData(</span><span style="font-size:9pt;color:#94558d;">self</span><span style="font-size:9pt;">, file):</span><span style="font-size:9pt;"> </span></pre></div> <span style="color:#000080;font-weight:bold;">while True</span>:<br> filename = file<br><span style="color:#94558d;">self</span>.f = <span style="color:#000080;">open</span>(filename, <span style="color:#008080;font-weight:bold;">'rb'</span>)<br> l = <span style="color:#94558d;">self</span>.f.read(<span style="color:#0000ff;">1024</span>)<br><span style="color:#000080;font-weight:bold;">while </span>(l):<br><span style="color:#94558d;">self</span>.client_socket.send(l)<br><span style="color:#94558d;">self</span>.sentData = <span style="color:#000080;">repr</span>(l)<span style="color:#808080;font-style:italic;"><br></span><span style="color:#808080;font-style:italic;"> </span><span style="color:#000080;">print</span>(<span style="color:#008080;font-weight:bold;">'Sent '</span>, <span style="color:#94558d;">self</span>.sentData)<br> l = <span style="color:#94558d;">self</span>.f.read(<span style="color:#0000ff;">1024</span>)<br><span style="color:#94558d;">self</span>.f.close()<br><span style="color:#000080;">print</span>(<span style="color:#008080;font-weight:bold;">'Done sending'</span>)<br><span style="color:#94558d;">self</span>.client_socket.send(<span style="color:#008000;font-weight:bold;">b''</span>)<br><span style="color:#000080;font-weight:bold;">break<br></span><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;"><br></span></pre><pre></pre><pre style="font-family:'굴림체';font-size:9pt;">---------클라이언트 클래스 중에서----------(GUI에서 클라이언트 소켓 객체 생성)</pre><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;">def </span>file_open(<span style="color:#94558d;">self</span>, file):<br><span style="color:#94558d;">self</span>.f = <span style="color:#000080;">open</span>(file, <span style="color:#008080;font-weight:bold;">'wb'</span>)<span style="white-space:pre;"> </span> <span style="white-space:pre;"><br></span> <span style="color:#000080;">print</span>(<span style="color:#008080;font-weight:bold;">'file opened'</span>)</pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><div style="font-family:'굴림체';font-size:9pt;"><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;">def </span>recvData(<span style="color:#94558d;">self</span>,file):<span style="white-space:pre;"> </span><br><br><span style="color:#94558d;">self</span>.f = <span style="color:#000080;">open</span>(file, <span style="color:#008080;font-weight:bold;">'wb'</span>)<br><span style="color:#000080;">print</span>(<span style="color:#008080;font-weight:bold;">'file opened'</span>)<br><br><span style="color:#000080;font-weight:bold;">while True</span>:<span style="white-space:pre;"> </span></pre><pre style="font-family:'굴림체';font-size:9pt;"> <span style="color:#000080;">print</span>(<span style="color:#008080;font-weight:bold;">'receiving data...'</span>)<br> data = <span style="color:#94558d;">self</span>.client_socket.recv(<span style="color:#0000ff;">1024</span>)<br><span style="color:#000080;">print</span>(<span style="color:#008080;font-weight:bold;">'data='</span>, data.decode(<span style="color:#008080;font-weight:bold;">'utf-8'</span>))<span style="white-space:pre;"> </span><br><span style="color:#000080;font-weight:bold;">if not </span>data:<span style="white-space:pre;"> </span><b></b><span style="white-space:pre;"><br></span> <span style="font-weight:bold;"><span style="color:#000080;white-space:pre;"> </span></span><span style="color:#000080;font-weight:bold;"> </span><span style="color:#94558d;">self</span>.f.write(data)<span style="white-space:pre;"> </span><br><span style="color:#94558d;"> self</span>.f.close()<span style="white-space:pre;"> </span><b></b><br><span style="color:#000080;"> print</span>(<span style="color:#008080;font-weight:bold;">'Successfully get the file'</span>)<span style="white-space:pre;"> </span> <b></b></pre></div><div style="font-family:'굴림체';font-size:9pt;"><br></div><div style="font-family:'굴림체';font-size:9pt;"><br></div><div style="font-family:'굴림체';font-size:9pt;">----------------------------------------------------</div><div style="font-family:'굴림체';font-size:9pt;"><br></div><div style="font-family:'굴림체';font-size:9pt;">GUI에서 버튼 클릭 시 recvData 메소드를 불러옵니다.</div><div style="font-family:'굴림체';font-size:9pt;"><br></div><div style="font-family:'굴림체';font-size:9pt;"><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;">def </span>clientBtn_clicked(<span style="color:#94558d;">self</span>):<br></pre><pre style="font-family:'굴림체';font-size:9pt;"></pre><pre style="font-family:'굴림체';font-size:9pt;">self<span style="font-size:9pt;">.C_socket.file_open(</span><span style="font-size:9pt;color:#008080;font-weight:bold;">'./text.txt'</span><span style="font-size:9pt;">)</span></pre></div><div style="font-family:'굴림체';font-size:9pt;"><pre style="font-family:'굴림체';font-size:9pt;"><span style="white-space:pre;"> </span>t = threading.Thread(<span style="color:#660099;">target</span>=<span style="color:#94558d;">self</span>.C_socket.recvData)<span style="white-space:pre;"> </span><br><span style="white-space:pre;"> </span>t.start()<span style="white-space:pre;"> </span><br></pre><pre style="font-family:'굴림체';font-size:9pt;"></pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;">-----------------------------------------------------------------------------</pre><pre style="font-family:'굴림체';font-size:9pt;">혹시 제가 스레드나 다른 부분에서 잘못한 부분이 있을까요??</pre><pre style="font-family:'굴림체';font-size:9pt;">조언좀 부탁드립니다.</pre></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.