socket is closed异常的原因及其解决方法

本文分析了客户端出现socketisclosed异常的原因及解决办法。异常通常发生在主动关闭连接后继续进行读写操作时。文中提供了错误示例代码,并展示了如何通过调整代码顺序避免此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个有关socket的程序中,客户端出现了 socket is closed异常,我百思不得其解,并没有关闭socket啊。

下面首先来分析一下这个异常出现的原因:该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

而造成socket关闭常见的有以下两种:
1、调用了.close()方法关闭socket
2、关闭了输入输出流

下面来看一下我的错误代码

 BufferedWriter bufferedWriter=null;
                try {
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

                } catch (IOException e) {
                    Log.d("Client","BufferedWriter出错");
                    e.printStackTrace();
                }
                // 获得EditTex的内容
                String text = mEditText.getText().toString();
                Log.e("Client","即将发送的信息为:"+text);
                Log.e("Client","haha");
                try {
                    // 发送数据
                    if (bufferedWriter != null) {
                        bufferedWriter.write(text+"\r\n");
                    }
                    bufferedWriter.flush();
                    bufferedWriter.close();
                } catch (IOException e) {
                    Log.e("Client","发送数据出错");
                    e.printStackTrace();
                }
                Log.e("Client", "成功发送数据");
                // 清空内容
                mEditText.setText("");
                Log.e("Client", "下面开始读取数据");
                try {
                    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));
                    Log.e("Client","完毕");
                    String s=in.readLine();
                    Log.e("Client",s);
                } catch (IOException e) {
                    Log.e("Client",e.getMessage());
                }

可以看到在用write()方法传送完成后,又调用了bufferedWriter.close();正是因为这一行代码,导致socket closed。而下面BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));因此出现异常

那么我们的解决方式是将bufferedWriter.close();下移到末尾处即可如下:

 BufferedWriter bufferedWriter=null;
                try {
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

                } catch (IOException e) {
                    Log.d("Client","BufferedWriter出错");
                    e.printStackTrace();
                }
                // 获得EditTex的内容
                String text = mEditText.getText().toString();
                Log.e("Client","即将发送的信息为:"+text);
                Log.e("Client","haha");
                try {
                    // 发送数据
                    if (bufferedWriter != null) {
                        bufferedWriter.write(text+"\r\n");
                    }
                    bufferedWriter.flush();

                } catch (IOException e) {
                    Log.e("Client","发送数据出错");
                    e.printStackTrace();
                }
                Log.e("Client", "成功发送数据");
                // 清空内容
                mEditText.setText("");
                Log.e("Client", "下面开始读取数据");
                try {
                    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));
                    Log.e("Client","完毕");
                    String s=in.readLine();
                    Log.e("Client",s);
                } catch (IOException e) {
                    Log.e("Client",e.getMessage());
                }
### SolidWorks Flexnet License Manager 服务无法启动解决方案 当遇到 **SolidWorks Flexnet License Manager** 服务无法启动的问题时,通常可以从以下几个方面排查并解决问题: #### 1. 检查日志文件 `lmgrd.log` 的权限设置 如果 `lmgrd.log` 文件的权限不正确,可能导致许可证管理器无法正常写入日志信息。需要确保该文件具有适当的读写权限。可以通过以下命令调整文件权限(假设运行环境为 Linux 或类 Unix 系统): ```bash chmod 755 /path/to/lmgrd.log chown user:group /path/to/lmgrd.log ``` 上述操作会赋予文件合适的权限以及正确的所有者[^1]。 #### 2. 验证端口配置是否正确 某些情况下,错误提示可能是因为默认端口未被监听或者防火墙阻止了通信。根据已有资料,FlexNet 默认使用的端口号可能是 1056[^2]。因此需验证服务器上的此端口是否开放,并允许外部访问。此外还需注意是否有其他程序占用了相同端口。 对于 Windows 平台下的具体修改方式如下所示: 进入许可中心界面后发现连接失败,则手动指定目标地址及其对应端口号作为替代选项之一来尝试修复问题;而对于跨平台间的数据交换则推荐采用标准化程度更高的FTP而非依赖于特定系统的SMB协议完成任务需求[^4]。 #### 3. 处理潜在的安全漏洞风险 由于存在已知安全缺陷——即向服务器发送恶意构造数据包能够触发堆栈缓冲区溢出进而取得控制权的情况发生,在部署之前应当仔细评估当前版本是否存在此类隐患并通过官方渠道获取最新补丁加以防范措施落实到位后再投入使用环境中去减少不必要的安全隐患影响业务连续性和稳定性表现等方面考虑周全之后再做决定最为稳妥可靠的做法。 #### 4. 安装完成后初始化状态异常情况处置建议 假如按照常规流程完成了全部必要组件安装工作却依旧遭遇 “Could Not Connect To Any License Servers”的警告消息弹窗提醒的话,请依照下面给出的操作指南逐步排除故障原因所在之处直至恢复正常运作为止即可成功解决这一难题现象出现频率较高的情形下采取有效应对策略显得尤为重要不可忽视任何一个细节环节才行哦! - 当首次打开应用软件的时候出现了找不到可用授权服务器列表可供选择时候应该怎么做呢?很简单只需要重新回到刚才提到过的那个对话框里面再次点击“Yes”,然后再依次挑选“Specify”按钮继续往下走就可以了哈!最后记得一定要把这里的端口号数值设定成为我们前面所讲的那个固定值也就是‘1056’这个数字填进去就好啦~接着按一下OK键结束整个过程吧😊👍🏻 --- ### 提供一段 Python 脚本用于自动化检测端口占用状况 以下是可用于检查某个给定主机上某特定端口是否处于活动中的简单脚本例子: ```python import socket def check_port(host, port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex((host, int(port))) if result == 0: print(f"Port {port} on {host} is OPEN.") else: print(f"Port {port} on {host} is CLOSED or FILTERED.") if __name__ == "__main__": host_ip = 'localhost' # Replace with your actual IP address. target_port = 1056 # Default LMGRD service port number. check_port(host_ip, target_port) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值