解决Socket端口关闭后监听方法出错


1. ServerSocket.accept

2. Socket.InputStream

以上是两个阻塞方法,监听客户端的连接请求和输入流


当用CTRL+C结束程序时,如果执行Socket.close的动作(特别是在ShutDownHook线程中执行),监听中的方法肯定报错。


解决此问题的方法是: 执行完毕必要的结束处理动作,不要执行关闭动作,则不会报错


让系统自动清理占用的端口资源


--------------- 程序退出时的错误 不影响功能,但对完美主义者来说是不可接受的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端: #include #include // 包含套接字函数库 #include #include // 包含AF_INET相关结构 #include // 包含AF_INET相关操作的函数 #include #include #include #define PORT 6789 #define IP_ADDR "127.0.0.1" #define SIZE 10240 int main() { struct tm *timeptr; time_t timeval; //时间变量 char tm[50]; int sockfd; // 用于保存客户套接字标识符 int len; // 用于客户消息长度 struct sockaddr_in address; // 定义客户套接字地址结构体 int result; sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型 address.sin_family = AF_INET; // 定义套接字地址中的域 address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_addr.s_addr = inet_addr(IP_ADDR); // 定义套接字地址 address.sin_port = htons(PORT); // 定义套接字端口 char buf[100]; // 定义要传送的消息 memset(buf,0,100); char str[90]; //存贮输入的语句 char shmaddr[SIZE]; //接受服务器发送的全部聊天数据 int i=0; char myname[100]; char say[10]={"说:"}; printf("欢迎来到聊天室,请输入你的姓名:"); scanf("%s",myname); len = sizeof(address); result = connect(sockfd, (struct sockaddr *) &address, len); // 请求连接 if (result == -1) { perror("Connect failed"); return 1; } printf("%s成功登录服务器:\n",myname); pid_t pid; pid=fork(); if(pid==-1) { printf("fork failed"); } int sendbytes=0; if(pid==0) //子进程用于发送数据 { while(1) { scanf("%s",str); (void)time(&timeval); strcpy(tm,ctime(&timeval)); strcpy(buf,myname); //姓名传入buf中 strcat(buf,":"); strcat(buf,str); strcat(buf," ["); strc
好的,以下是一对一Socket客户端与服务器程序的Python实现,已经满足你提出的要求: 服务器端程序: ```python import socket HOST = '127.0.0.1' # IP地址 PORT = 8000 # 端口号 # 创建Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_socket.bind((HOST, PORT)) # 监听连接请求 server_socket.listen(1) print('服务器已启动,等待客户端连接...') # 处理客户端请求的函数 def handle_client(client_socket): while True: try: # 接收客户端发送的消息 data = client_socket.recv(1024).decode('utf-8') if not data: break print('客户端:', data) # 向客户端发送消息 message = input('服务器:') client_socket.send(message.encode('utf-8')) if message == 'quit': break except Exception as e: print('出错了:', e) break # 关闭客户端连接 client_socket.close() print('客户端已关闭连接') while True: try: # 接收客户端连接请求 client_socket, addr = server_socket.accept() print('客户端已连接,IP地址:', addr[0], '端口号:', addr[1]) # 创建新的线程处理客户端请求 client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() except Exception as e: print('出错了:', e) break # 关闭服务器Socket连接 server_socket.close() print('服务器已关闭连接') ``` 客户端程序: ```python import socket HOST = '127.0.0.1' # 服务器的IP地址 PORT = 8000 # 服务器的端口号 # 创建Socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立Socket连接 client_socket.connect((HOST, PORT)) print('连接服务器成功') while True: try: # 向服务器发送消息 message = input('客户端:') client_socket.send(message.encode('utf-8')) if message == 'quit': break # 接收服务器发送的消息 data = client_socket.recv(1024).decode('utf-8') print('服务器:', data) except Exception as e: print('出错了:', e) break # 关闭Socket连接 client_socket.close() print('客户端已关闭连接') ``` 这份代码输出了每个步骤过程及必要信息,包括监听消息、IP地址和端口号等。在出错时,会提示具体哪步出错出错信息。同时,程序实现了客户端与服务器的对话,并且在客户端输入quit后,服务器会关闭Socket连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值