Home  >  Article  >  Backend Development  >  Socket programming under Python

Socket programming under Python

高洛峰
高洛峰Original
2016-10-19 10:33:131203browse

The first thing that needs to be explained is that this article will not record the profound socket programming, but will analyze the handling of several special exceptions in the simplest socket programming chat room. The code is as follows:

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

Note:

1. When the client is forcibly closed (such as when pressing the stop button on the left side of the debugging window in pycharm), the client will of course report an error, but on the Linux system, the server No error will be reported, but the received information is considered to be empty, that is, the server_recv_data here is empty, so the server makes a judgment to exit the inner loop so that it can connect to the connection requests sent by other clients;

2. When the client enters exit to exit the current chat, the client here judges break to exit. The key is that the result obtained by the server at this time is that server_recv_data is empty, which is the same as the above situation;

3. The only one What can cause the server-recv_data = conn.recv(1024) to be blocked is that the client directly presses Enter. At this time, an embarrassing situation is that the server is still waiting for the client to send information (thinking that no information has arrived). The client can no longer send information because it has pressed Enter just now. Although the information can be entered again, it cannot be sent (even pressing Enter again is useless). Therefore, in order to solve this problem, we default to thinking that when the client makes This action indicates that you want to exit. At this time, inp is empty, so the client makes a judgment of if not inp: and exits the chat. The server receives an empty message. After break, it continues to wait for other connections


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn