이전 위치는 우리가 수행 할 수 있지만, 코드를 작성하지만, 많은 잠재적 인 버그가합니다
- 문제 해결
- 포트 재사용이 : 때때로 포트 OS 복구 시간이 필요하기 때문에 서버 포트는 여전히 점유 해제, 이번에는이 개 솔루션이있다 :
- 재사용 포트를 달성하는 방법 .setsockopt
- 리눅스 OS의 경우 : 리눅스 시스템 설정을 수정
클라이언트가 빈 문자열을 보낼 때 클라이언트에 응답하지 않도록 서버가 물건을받을 수 없기 때문에, 그것은 클라이언트에 RECV 단계에 갇혀됩니다
원리 : 운영 체제를 통해 데이터를 전송 및 수신해야하는 응용 프로그램, 그것은 본질적으로 보내고 RECV 데이터와 자신의 OS 메모리 데이터와 상호 작용한다. OS 통신 정보는 그 프로토콜에 따라 처리된다. 클라이언트가 추가 헤더를 통해 데이터, 빈 데이터를 전송하면 서버에 할,하지만 서버에 OS 만 해당 아무것도 물건을받지 못한 경우 서버 응용 프로그램이 메모리에서 데이터를 검색, 그래서 난 몰라 그것은 클라이언트에 데이터를 전송합니다.
- 필요성은 클라이언트에서 빈 데이터를 피하기 위해
- 클라이언트 (즉, 양방향 연결 CONN 소켓 물체 측이 턴 오프된다) 강제 종료,
- 리눅스 : 무제한 서버가 즐겁게 (NULL 바이트는 무한 루프에 수신 된)
- 윈도우 불평 할 것이다 : ConnectionResetError를
- 포트 재사용이 : 때때로 포트 OS 복구 시간이 필요하기 때문에 서버 포트는 여전히 점유 해제, 이번에는이 개 솔루션이있다 :
server.py
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 端口重用
phone.bind(('127.0.0.1',8080))
phone.listen(5)
print('starting...')
conn, client_addr = phone.accept()
#5 收,发消息(传数据)
while True:
try: # windows的情况会报错,所以我们需要异常处理
data = conn.recv(1024)
if not data : break # 避免服务端的死循环:Linux的情况下
print('客户端的数据',data)
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
phone.close()
client.py
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080))
#3 发,收消息
while True:
msg = input('>>> : ').strip()
if not msg : continue # 避免客户端发空数据(这个写法留意一下)
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data)
phone.close()