可以进行网络请求并返回数据,但是在winform窗体关闭时服务端出现了异常:

Exception happened during processing of request from ('127.0.0.1', 63951)
Traceback (most recent call last):
  File "C:\Python\Python37\lib\socketserver.py", line 650, in process_request_thread
    self.finish_request(request, client_address)
  File "C:\Python\Python37\lib\socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python\Python37\lib\socketserver.py", line 720, in __init__
    self.handle()
  File "C:\Python\Python37\lib\site-packages\django\core\servers\basehttp.py", line 171, in handle
    self.handle_one_request()
  File "C:\Python\Python37\lib\site-packages\django\core\servers\basehttp.py", line 179, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "C:\Python\Python37\lib\socket.py", line 589, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

C#网络请求的代码如下:

string Url = "http://localhost:8000/calc";
string jsonParam = "{\"color1\":\"#ccff66\",\"color2\":\"#ccff77\"}";
var request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/json;charset=UTF-8";
var byteData = Encoding.UTF8.GetBytes(jsonParam);
var length = byteData.Length;
request.ContentLength = length;
var writer = request.GetRequestStream();
writer.Write(byteData, 0, length);
writer.Close();
var response = (HttpWebResponse)request.GetResponse();
var responseStream = response.GetResponseStream();
var streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
var responseString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();

从异常日志可以看出,异常是在读取数据的时候抛出的。

导致“Connection reset”的原因是服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,“RST”标志表示我不再发送数据也不接收数据了,然后此时客户端就会提示“java.net.SocketException: Connection reset”。

另一个比较常见的异常是“Connection reset by peer”,它和“Connection reset”的区别在于:

  • 服务器返回了“RST”时,如果此时客户端正在从Socket套接字的输出流中读数据则会提示Connection reset”;
  • 服务器返回了“RST”时,如果此时客户端正在往Socket套接字的输入流中写数据则会提示“Connection reset by peer”。

C#中用HttpWebRequest进行网络请求时默认是长连接,可以打印request.KeepAlive值确认。因此建立连接后,在关闭窗口时会向服务端进行挥手来关闭TCP连接。

而django中进行网络请求默认是短连接,这就导致客户端向服务端挥手时,服务端已经关闭了连接,出现异常。 这里不敢确认,后面有时间研究一下吧

知道了原因就可以从以下方面来解决:

  • 异常后重试
  • 客户端和服务端统一使用TCP长链接
  • 客户端和服务端统一使用TCP短链接

最终解决方法是在客户端请求时设置为短连接:

request.KeepAlive = false;
场景: 在winform窗体里进行post请求,服务端是python-django写的。现象: 可以进行网络请求并返回数据,但是在winform窗体关闭时服务端出现了异常:Exception happened during processing of request from ('127.0.0.1', 63951)Traceback (most rec...
NotADirectoryError: [ WinError 267] 目录名称无效。: ‘C:\Program Files\SeleniumDrivers\geckodriver.exe’ 今天在测试火狐浏览器Firefox Selenium WebDriver的时候遇到NotADirectoryError: [ WinError 267] 这个错误,代码如下: # -*- coding:utf-8 -*- 测试firefox webdriver 文件:WebDriverDemo.py 作者:zhangxl 日期:2020年05月05日 from selenium import
ConnectionError: (‘Connection aborted.‘, ConnectionResetError (10054, ‘远程 主机 强迫 关闭 了一个 现有 连接 。‘, None, 1005
出现问题描述及分析: 最近做爬虫是,经常出现 ConnectionResetError : [ WinError 10054] 等错误,主要是因为使用urlopen方法太过频繁,引起远程 主机 的怀疑,被网站认定为是攻击行为,导致urlopen()后,request.read()一直卡死在那里,导致最后抛出10054 异常 。 具体解决办法: 1、设置sleep()等待一段时间后继续下面的操作【简单常用】
引起这种 异常 的原因: 1,如果一端的Socket被 关闭 (或主动 关闭 ,或因为 异常 退出而 引起的 关闭 ),另一端仍发送数据,发送的第一个数据包引发该 异常 (Connect reset by peer)。 Socket默认 连接 60秒,60秒之内没有进行心跳交互,即读写数据,就会自动 关闭 连接 。 2,一端退出,但退出时并未 关闭 连接 ,另一端如果在从 连接 中读数据则抛出该 异常 (Connection reset...
ConnectionResetError : [ WinError 10054] 远程 主机 强迫 关闭 了一个 现有 连接 。 错误结果: Traceback (most recent call last): File "G:/python图片下载/dianshiju_db.py", line 25, in <module> print(imgdon("http://tupian.tup...
录下载ScanNetv2数据集中出现的问题,前言:ScanNet V2数据集命令行下载出错 在用官方的方法下载了大概一天后,突然出现了这样的错误: ConnectionResetError : [ WinError 10054] 远程 主机 强迫 关闭 了一个 现有 连接 。 这个错误我之前没有见过,可能是下载太频繁了被对方网站认为是恶意攻击了?我以为过段时间就可以再次下载了,所以接下来的一天时间我隔一会就重新运行一下用来下载数据集的代码,但是始终出现同样的错误。我想,那不行啊,数据集才下载了一点,总得想办法把它下完整
[Errno 104] Connection reset by peer errno 104表示对一个对端socket已经 关闭 连接 调用write或send方法。这种情况下,调用write或者send之后,对端socket便会向本端socket发送一个Reset信号,之后继续执行write/read,就会得到104. netstat -ntpl lsof -i:6379 通过lsof -i:6379可以发现端口未开放..
使用Django框架,删除数据时,突然提示如下错误: Exception happened during processing of request from( 127.0.0.1  xxx)  error :[Errno 10053] 经过各种搜索和尝试,应该是在删除时又做了其他的操作,故会提示该错误 仔细检查出现该错误提示的方法流程,排查前端和后端是否有异步执行的代码会相互影响 python调用c/c++代码以及解决ctypes.ArgumentError: argument 1: class 'TypeError': Don't know how to convert 11722