소켓 네트워크 프로그래밍 (5)의 제 VIII : 클라이언트와 서버 코드 버그 수정 (코드 완성)

이전 위치는 우리가 수행 할 수 있지만, 코드를 작성하지만, 많은 잠재적 인 버그가합니다

  • 문제 해결
    • 포트 재사용이 : 때때로 포트 OS 복구 시간이 필요하기 때문에 서버 포트는 여전히 점유 해제, 이번에는이 개 솔루션이있다 :
      • 재사용 포트를 달성하는 방법 .setsockopt
      • 리눅스 OS의 경우 : 리눅스 시스템 설정을 수정
    • 클라이언트가 빈 문자열을 보낼 때 클라이언트에 응답하지 않도록 서버가 물건을받을 수 없기 때문에, 그것은 클라이언트에 RECV 단계에 갇혀됩니다

      원리 : 운영 체제를 통해 데이터를 전송 및 수신해야하는 응용 프로그램, 그것은 본질적으로 보내고 RECV 데이터와 자신의 OS 메모리 데이터와 상호 작용한다. OS 통신 정보는 그 프로토콜에 따라 처리된다. 클라이언트가 추가 헤더를 통해 데이터, 빈 데이터를 전송하면 서버에 할,하지만 서버에 OS 만 해당 아무것도 물건을받지 못한 경우 서버 응용 프로그램이 메모리에서 데이터를 검색, 그래서 난 몰라 그것은 클라이언트에 데이터를 전송합니다.

      • 필요성은 클라이언트에서 빈 데이터를 피하기 위해
    • 클라이언트 (즉, 양방향 연결 CONN 소켓 물체 측이 턴 오프된다) 강제 종료,
      • 리눅스 : 무제한 서버가 즐겁게 (NULL 바이트는 무한 루프에 수신 된)
      • 윈도우 불평 할 것이다 : ConnectionResetError를

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()

추천

출처www.cnblogs.com/py-xiaoqiang/p/11298981.html