- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一个 TCP 客户端/服务器,并且在代码的后半部分遇到了这个 broken pip 错误。由于对 Python 和套接字编程的了解有限,我无法确定原因,因此无法解决问题。我将不得不包括所有代码,因为可能存在某种冲突导致我不知道的这个问题,对于长篇文章感到抱歉。
我在下面标记了我遇到问题的地方,到目前为止一切正常。
服务器代码:
import os
from socket import *
import urllib
import time
HOST = '' #We are the host
PORT = 29876
PORT2 = 29877
ADDR = (HOST, PORT)
ADDR2 = (HOST, PORT2)
BUFFSIZE = 4096
serv = socket( AF_INET,SOCK_STREAM)
serv.bind(ADDR,)
serv.listen(5)
print ('listening... \n')
conn,addr = serv.accept()
print (conn,addr)
print ('...connected \n')
with open(os.path.expanduser("~/.ssh/id_rsa.pub")) as f:
key = f.read()
conn.sendall(key)
print("Key Sent... \n")
data = conn.recv(BUFFSIZE)
with open('ip.txt', 'w') as myfile:
myfile.write(str(data))
with open("ip.txt", "r") as myfile:
ip=myfile.read().replace('\n','')
print("The client IP is: " + ip + "\n")
conn.close()
ver = socket(AF_INET,SOCK_STREAM)
ver.bind(ADDR2,)
ver.listen(5)
print('listening...\n')
build,addr = ver.accept()
print (build,addr)
print('...connected\n')
#Get Version
version = urllib.urlopen("http://p.b.r.com/pa/b/latest.txt")
print(version.read())
#IT IS SENDING THIS LAST PIECE OF DATA THAT CAUSES THE BROKEN PIPE ERROR
version = str(version.read())
ver.send(version)
客户端代码:
from socket import *
from winreg import *
import os
import socket
import platform
import string
import time
#Detect OS
os = platform.system()
print("Your system is running "+ os)
#Set Host address and port
HOST = 'xxx.xxx.xxx.xxx'
PORT = 29876
PORT2 = 29877
ADDR = (HOST,PORT)
ADDR2 = (HOST, PORT2)
BUFFSIZE = 4096
cli = socket.socket( AF_INET, SOCK_STREAM)
cli.connect(ADDR,)
#Get and send IP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("gmail.com",80))
ip = ((s.getsockname()[0]))
ip = ip.encode('utf-8')
cli.send(ip)
print("IP Sent... \n")
#Set received key to write to known hosts
data = cli.recv(BUFFSIZE)
with open('C:\cygwin\home\scollins\.ssh\known_hosts', 'w') as myfile:
myfile.write(str(data,'utf-8'))
print("Key Saved To Known Hosts")
#Close opened sockets
s.close()
cli.close()
ver = socket.socket( AF_INET, SOCK_STREAM)
ver.connect(ADDR2,)
#Get version/build number
if os == "Windows":
#Connect to the registry
regKey = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
subKey = OpenKey(regKey, r"SOFTWARE\R\R Client")
buildno = QueryValueEx(subKey, "Version")
else:
if os == "Darwin":
buildno = open("\Library\R\buildno")
else:
if os == "Linux":
buildno = open("\r\buildno")
print("You are running software build number " + str(buildno))
#Receive and write server software version to file. Read file and compare build number
data = ver.recv(BUFFSIZE)
#THIS NEXT PRINT COMMAND RETURNS NOTHING WHICH I ASSUME IS DUE TO NOTHING BEING RECEIVED DUE TO THE BROKEN PIPE
print(str(data))
with open('version.text', 'w') as myfile:
myfile.write(str(data,'utf-8'))
with open('version.txt', 'r') as myfile:
version = myfile.read()
print("The software on the server is version: " + version)
if buildno in version == True:
print("Your sofware version is up to date")
else:
print("Your software is out of date. Updating your software.")
os.system('')
ver.close()
感谢您提供的任何帮助。
最佳答案
好吧,我在工作时没有在这里安装 python3,但仅从代码来看,您似乎正试图在服务器部分使用服务器套接字发送一些东西。
你在 ver 上调用 accept:
build,addr = ver.accept()
然后您尝试在 ver 上发送,而不是在 build 上发送:
ver.send(version)
通常它是这样工作的:在服务器端,你有一个“服务器”套接字,你调用绑定(bind)然后接受,等待传入的连接。每次客户端连接时,accept 都会产生一个套接字来与这个特定的客户端(“客户端”套接字)对话。如果所有通信都通过服务器套接字进行,您如何拥有多个客户端并知道您正在与哪个客户端“交谈”?
代码中的第二个错误是调用 version.read() 来打印值,然后再次发送它。 read()“消耗”数据,因此第二个 read() 给出了一个空结果。
此外,您应该在循环中调用 send(),检查其返回值,以确保所有数据都已实际发送。可能会发生部分发送。
关于 python 3 : TCP Client/Server Broken Pipe Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939428/
我有管道输出 command_a | command_b | ... | command_n 输出是一个数字序列 4.2 -1 ... 0.2 我可以使用 gnuplot 绘制这些数字吗? (将 gn
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我目前正在尝试连接父项和子项之间的管道。子级正在执行 sort 并对从父级接收到的输入进行排序。然后 children 写入一个单独的管道。每个进程有两个管道。一个这样 parent 可以将输入发送给
最近我正在研究 Python 中的并行编程工具。这是 os.pipe 和 multiprocessing.Pipe 之间的两个主要区别。(尽管它们被使用的场合) os.pipe是单向,multipro
我的站点上运行着 Yahoo Pipe,Romneyomics它使用来自 Delicious 和 Topsy 的饲料。Delicious 提要不提供“描述”字段,但 Topsy 提供,并且不仅仅是一个
我有一些使用管道的 Haskell 代码: module Main(main) where import Pipes a :: Producer Int IO () a = each [1..10]
所以标题几乎解释了我的问题。 stdout=subprocess.PIPE 和 stdout=PIPE 有什么区别?两者都来自 subprocess 模块,但为什么要使用一个而不是另一个呢?你如何使用
我有一个名为“myPipe”的自定义管道。我得到: The pipe 'myPipe' could not be found error 在我的单元测试中请建议在我的 .spec.ts 中导入和声明什
我有一个非常简单的 Python 3 脚本: f1 = open('a.txt', 'r') print(f1.readlines()) f2 = open('b.txt', 'r') print(f
我正在使用管道和 Python 的多处理模块在进程之间发送简单的对象。文档指出,如果管道已关闭,则调用 pipe.recv() 应该引发 EOFError。相反,我的程序只是阻塞在 recv() 上,
我在 perl 中见过这两种形式的管道 open。 一种是简单的管道打开 open FH,'| command'; 其他是安全管道打开 open FH,'|-','command'; 现在,第二个中的
我正在尝试对我的组件进行单元测试,但它立即生成一个错误: 类型错误:this.store$.pipe 不是函数 根据我的理解, createSpyObj 应该模拟状态。我有不同的选项选项,但没有一个起
我在这里看到这个帖子很多次了;但未能从命令中捕获故意错误。迄今为止我找到的最好的部分工作.. from Tkinter import * import os import Image, ImageTk
我正在编写一个简单的程序来解析编译器的输出并重新格式化任何错误消息,以便我们使用的 IDE(visual studio)可以解析它们。我们使用 nmake构建,它将使用如下命令行调用编译器: cc16
我有一个在coreos上运行的kubernetes集群。我希望在称为记录的Pod中的容器中运行journal2gelf https://github.com/systemd/journal2gelf。
为什么当管道中没有写入器时,读取器存在可以,但当管道中没有读取器时,写入器存在就不行? 。是不是因为reader需要等待,所以没有writer也没关系,而writer已经准备好数据了,即使数据准备好了
我在/etc/postfix/master.cf 中创建了一个 postfix 命令管道,其中包含一个在 STDOUT 和 STDERR 上产生输出的有效命令。在终端上调用时一切正常(因此在 STDO
我有一个命令需要来自管道的输入。例如,考虑著名的 cat 命令: $ echo Hello | cat Hello 假设我在 Perl 6 程序中有一个字符串,我想将其通过管道传递给命令: use v
因此,由于我们拥有各种设置,我习惯于遇到需要将一个可观察结果添加到另一个结果的地方,然后同时使用两者。我需要第一个在另一个之前完成的地方 getUser() .pipe( mergeMap
我在 Angular 5 中有一个非常简单的管道 import { Pipe, Injectable } from '@angular/core'; @Pipe({ name: "defaul
我是一名优秀的程序员,十分优秀!