Heim  >  Artikel  >  Backend-Entwicklung  >  Socket-Programmierung unter Python

Socket-Programmierung unter Python

高洛峰
高洛峰Original
2016-10-19 10:33:131241Durchsuche

Das erste, was erklärt werden muss, ist, dass dieser Artikel nicht die tiefgreifende Socket-Programmierung aufzeichnet, sondern die Behandlung mehrerer spezieller Ausnahmen im einfachsten Socket-Programmier-Chatroom analysiert. Der Code lautet wie folgt:

Server:

import socket

HOST = ""
PORT = 8870
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.bind((HOST, PORT))
sk.listen(5)
while True:
    print("服务器启动")
    conn, addr = sk.accept()
    print(addr)
    while True:
        try:
            server_recv_data = conn.recv(1024)  #若客户端输入exit退出,则此处并没有阻塞,只是收到的信息为空
            #若客户端输入空,即直接按下回车键,那么此处将会被阻塞
            if len(server_recv_data) == 0:
                print("收到为空")
                break
        except ConnectionResetError as err:
            print(err)
            break
        print(str(server_recv_data, encoding="utf-8"))
        server_resp_data = input(">>>")
        conn.sendall(bytes(server_resp_data, encoding="utf-8"))
    conn.close()
sk.close()

Client:

import socket

HOST = "127.0.0.1"
PORT = 8870
sk = socket.socket()
sk.connect((HOST, PORT))
print("客户端启动...")

while True:
    inp = input(">>>")
    if inp == "exit"or not inp:  #此处需要说明的是,当直接在客户端按下回车enter键的时候,inp为空
        break
    sk.sendall(bytes(inp, encoding="utf-8"))
    server_response = sk.recv(1024)
    print(str(server_response, encoding="utf-8"))
sk.close()

Hinweis:

1 Wenn der Client gewaltsam geschlossen wird (z. B. durch Drücken von Debug in Pycharm). Wenn die Schaltfläche auf der linken Seite des Fensters gedrückt wird, meldet der Client natürlich einen Fehler, aber auf dem Linux-System meldet der Server keinen Fehler. Er geht lediglich davon aus, dass die empfangenen Informationen leer sind, d. h. die server_recv_data Hier ist leer, daher wird vom Server entschieden, die innere Schleife zu verlassen, damit von anderen Clients gesendete Verbindungsanforderungen verbunden werden können

2 Im aktuellen Chat entscheidet der Client, dass er beendet werden soll. Der Schlüssel ist, dass das vom Server zu diesem Zeitpunkt erhaltene Ergebnis leer ist, was dem obigen Fall entspricht

3 Was dazu führen kann, dass server-recv_data = conn.recv(1024) blockiert, ist: Der Client drückt direkt die Eingabetaste. Eine peinliche Situation ist zu diesem Zeitpunkt, dass der Server immer noch darauf wartet, dass der Client Informationen sendet (in der Annahme, dass keine Informationen vorhanden sind). angekommen). Der Client kann keine weiteren Informationen senden, da er gerade die Eingabetaste gedrückt hat. Er kann zwar erneut Informationen eingeben, diese können jedoch nicht gesendet werden (selbst ein erneutes Drücken der Eingabetaste ist nutzlos). Um dieses Problem zu lösen, verwenden wir dies standardmäßig Wenn der Client diese Aktion durchführt, bedeutet dies, dass er den Chat beenden möchte. Zu diesem Zeitpunkt ist inp leer Warten Sie nach der Pause weiterhin auf weitere Verbindungen


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn