java.net.SocketException:连接由对等方重置:服务文件时套接字写入错误

2023-12-19

我正在尝试使用套接字实现 HTTP 服务器。如果客户端(例如浏览器)请求目录,服务器将显示可用文件的列表。当客户端请求文件时就会出现问题。我收到以下错误:

java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at cf.charly1811.java.web.RequestHandler.writeFile(RequestHandler.java:152)
at cf.charly1811.java.web.RequestHandler.processRequest(RequestHandler.java:139)
at cf.charly1811.java.web.RequestHandler.handleRequest(RequestHandler.java:110)
at cf.charly1811.java.web.RequestHandler.run(RequestHandler.java:86)
at java.lang.Thread.run(Thread.java:745)

堆栈跟踪显示问题来自writeFile()方法:

private void writeFile(File request) throws IOException 
{
    InputStream byteReader = new BufferedInputStream(new FileInputStream(request));
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = byteReader.read(buffer)) != -1) 
    {
        outputStream.write(buffer, 0, bytesRead);
    }
    byteReader.close();
}

但我不知道出了什么问题。 你能帮助我吗?

EDIT

谢谢大家的回答。在我阅读了您的答案后,我明白问题出在 Socket 发生错误时。这是我的错误代码:

// Method to process a single request
handleRequest() throw IOException
{
    // process here
    // if the client request a file
    writeFile();
    // close socket when the request is processed
}

// The method is called
public run()
{
    try{
        // If an error occurs the try/catch won't be called because it is implemented outside the loop. So when an IOException occurs, the loop just stop and exit the program
        while(true)
        {
            handleRequest();
        }
    }
    catch(IOException e) {
        // Handle exception here
    }
}

我的新代码如下所示:

// Method to process a single request
handleRequest()
{
   try {
        // process here
        // if the client request a file
        writeFile();
        // close socket when the request is processed
    }
    // If this exception occurs the catch() method will be called
    catch(IOException e)
    {
        // handle exception here
    }
}

// The method is called
public run()
{
    while(true)
        {
            handleRequest();
        }
    }
}

TCP 套接字有可能“关闭”,而您的代码尚未收到通知。

这是生命周期的动画。http://tcp.cs.st-andrews.ac.uk/index.shtml?page=connection_lifecycle http://tcp.cs.st-andrews.ac.uk/index.shtml?page=connection_lifecycle

基本上,连接被客户端关闭了。你已经拥有了throws IOException and SocketException延伸IOException。这工作得很好。你只需要正确处理IOException因为它是 api 的正常部分。

编辑:RST当在不存在或已关闭的套接字上接收到数据包时,就会发生数据包。您的应用程序没有任何区别。取决于实施情况reset状态可能会坚持并且closed永远不会正式发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.net.SocketException:连接由对等方重置:服务文件时套接字写入错误 的相关文章

随机推荐

  • C++ 序列化性能

    我正在构建一个分布式 C 应用程序 该应用程序需要对在不同进程和计算机之间传递的简单数据结构进行大量序列化和反序列化 我对序列化复杂的类层次结构不感兴趣 但更感兴趣的是发送带有一些简单成员 例如数字 字符串和数据向量 的结构 数据向量通常可
  • 如何在Redis 6 docker库中启用tls/ssl?

    最新版本的Redis Docker引入了TLS SSL功能 但我无法弄清楚如何为最新版本的 Redis Docker 启用它 此外 我还想知道 对于Docker环境 如何修改IO线程数 对于多线程 也在Redis 6中引入 Docker 的
  • UTF-8 是 Ruby v.2 中的默认编码吗?

    Matz 在他的书中写道 为了使用 UTF 8 您必须在脚本的第一行添加编码注释 他给我们举了一个例子 coding utf 8 Specify Unicode UTF 8 characters This is a string liter
  • 在 Python 中将字符串列表转换为整数(或双精度数)

    我有很多看起来与此类似的字符串列表 list 4 5 5 763 6 423 5 6 77 10 我想将其转换为整数 或双精度 列表 但是 不断产生错误 gt gt gt lst 4 5 5 763 6 423 5 6 77 10 gt g
  • 为什么我无法使用 UPnP 单播 M-SEARCH 来代替 MultiCast M-SEARCH?

    早上好 我们决定尽可能使用 UPnP 我们在 239 255 255 250 1900 上使用 MultiCast 进行 M SEARCH 不过 我们正在研究如何处理客户在其网络上锁定 MultiCast 的情况 查看 UPnP 1 1 规
  • 为什么 openCV 中的 CvBlobDetector 位于旧库中?

    是否有更新的斑点检测 跟踪库 这不是一个好的图书馆吗 难道遗留代码不应该是旧的 无用的代码吗 有人知道吗 这是较新的斑点检测器 http opencv itseez com modules features2d doc common int
  • Jquery 查找类型的第一个直接子代

    我正在寻找一种方法来查找精确类型的元素的第一个直接子元素 让我们想象一下这个标记 div div p Stuff p div p Stuff 2 p p Stuff 3 p div 所以在这里 我想要得到的是 Stuff 2 作为直接子代的
  • 好友声明介绍的姓名

    我正在考虑 N3797 工作草案 有来自3 3 1 4的引用 好友声明 11 3 可能会引入一个 可能不可见的 名称 进入封闭的命名空间 进一步在 3 3 2 11 中我发现 友元声明指的是作为成员的函数或类 最近的封闭命名空间 但它们不会
  • Node.js:计算文件中的行数

    我有很大的文本文件 其范围在30MB and 10GB 如何使用以下命令计算文件中的行数Node js 我有这些限制 不需要将整个文件写入内存 执行该任务不需要子进程 不使用wc的解决方案 var i var count 0 require
  • 通过 SSH 传输文件 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在命令行上通过 SSH 连接到远程服务器 并尝试使用以下命令将目录复制到本地计算机上scp命令 但是 远程服务器返回此 使用 消息 Stewart
  • 为什么let=0有效但var=0无效? [复制]

    这个问题在这里已经有答案了 为什么不 let 0 显示任何语法错误 但是 var 0 做 我在Safari上测试过 不过我尝试过 console log let 但它有错误 似乎 let 不是一个已经定义的变量 为什么会发生这种情况 Bec
  • gke-metrics-agent 与 prometheus 相关的多个错误

    我向 GKE 部署了一个新应用程序 我看到 GKE 仪表板的 gke metrics agent 上有数千个错误 它使用大量资源 I checked the logs and I saw all errors related to Prom
  • 是否可以重写控制台中的前一行?

    我正在尝试在我的控制台应用程序中创建过程动画 是否可以根据此需要重写以前的行 我知道关于 r但它仅适用于当前行 如果不可能的话 怎样才能实现动画效果呢 谢谢 我的控制台是标准 Ubuntu 12 04 终端模拟器 感谢 MrSmith42
  • 如何使用Python将BLOB插入Oracle?

    我正在尝试使用 cx Oracle 6 3 将大量 BLOB 每个 2 到 20 MB 插入到 Oracle 12 中 经过大量的谷歌搜索和实验 我得到了以下代码 我是 Python 新手 想知道 该方法有效吗 有更快的方法吗 usr lo
  • 使用 Get-Help cmdlet 以相同格式显示基于注释的帮助

    我尝试使用 Get Help cmdlet 以与显示从 XML 文件生成的 cmdlet 帮助主题相同的格式显示基于注释的帮助 执行此操作的能力记录在about Comment based Help http technet microso
  • Tridion GUI Extensions CommandSet 如何映射到 js 方法?

    Tridion GUI 扩展配置如何将名称映射到 JS 文件 例如 我正在使用 Jaime 的你好世界帖子 http jaimesantosalcon blogspot com 2011 02 sdl tridion 2011 ga gui
  • 如何在 C#/Win32 api 中找到 Windows 应用程序执行别名的目标?

    Microsoft Windows 终端 通过 Microsoft Store 安装 创建 0 字节wt exe文件是一个Windows 执行别名 https www tiraniddo dev 2019 09 overview of wi
  • 如何计算(数学)字符串表达式,vb.net

    我不确定我使用的术语是否正确 但我有一个字符串表达式 我希望计算它 这是一个例子 Dim S 4 4 dim result evaluate S some sort of treatment that return 8 我不确定这将如何运作
  • 与 MinGW-64 的静态链接

    我正在尝试使用 64 位 MinGWhttp sourceforge net projects mingw w64 files Toolchains 20targetting 20Win64 Automated 20Builds http
  • java.net.SocketException:连接由对等方重置:服务文件时套接字写入错误

    我正在尝试使用套接字实现 HTTP 服务器 如果客户端 例如浏览器 请求目录 服务器将显示可用文件的列表 当客户端请求文件时就会出现问题 我收到以下错误 java net SocketException Connection reset b