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