- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
关于我的问题,我是一名计算机专业的学生,第一次开始使用 Python。在此之前,我主要从事 Java 工作,现在我最熟悉 Java 约定和实践。
套接字编程的作业要求我们在机器本地的服务器和客户端之间发送字符串。我们提供了实例化服务器和客户端的示例 (Python 2) 代码。在作业上下文之外,我想创建此代码的一个版本,它也可以在 Python 3 中运行,但我在让客户端在 Python 3 中运行时遇到了问题。
最初,服务器只需要很少的改动,我就能让它正常工作。我的服务器代码如下:
#!/usr/bin/python3
import socket
HOST=''
PORT=5870
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(1)
conn, addr = sock.accept()
print('Connected by ', addr)
conn.sendto("Welcome to the server!", (HOST, PORT))
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
我无法将客户端转换为在 Python 3 中运行和运行的代码。我尝试更深入地研究这个问题,但其他在线资源对我没有帮助(或者至少,根据我的经验)等级)。我的服务器代码如下。
#!/usr/bin/python3
import socket
HOST='127.0.0.1'
PORT=5870
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
data = sock.recv(1024)
print('Server sent', data)
sock.sendto("Hello world".encode(), (HOST, PORT))
data = sock.recv(1024)
print("Server sent", data)
sock.sendto("This is the second message".encode(), (HOST, PORT))
data = sock.recv(1024)
print('Server sent ', data)
sock.close()
最初,此代码用于服务器和客户端使用 sendall()
而不是 sendto()
, 但我在获得 TypeError
后更改了它在客户端阅读this question .我仍然不确定为什么这样做有效或为什么我必须这样做(尽管我希望得到解释)。
现在,当我运行客户端代码时,我将得到相同的 TypeError
在服务器上,即使我正在使用 sendto()
,但我不确定如何在 Python 3 中解决此问题。我收到的服务器堆栈跟踪信息如下(客户端的管道损坏):
$ python3 mail_server.py
Connected by ('127.0.0.1', 41866)
Traceback (most recent call last):
File "mail_server.py", line 14, in <module>
conn.sendto("Welcome to the server!", (HOST, PORT))
TypeError: a bytes-like object is required, not 'str'
我做错了什么,我如何才能让它在 Python 3 中正常工作?关于为什么这样做的背景上下文会特别有帮助,因为我认为我的部分问题是我不明白为什么一开始就需要进行此更改。谢谢!
最佳答案
不要在流套接字上使用sendto()
。一旦连接了套接字(对于流式套接字,在连接之前你不能进行任何数据传输),你不能指定目的地,它总是被发送到它所连接的远程地址/端口。
所以使用send()
或sendall()
:
socket.sendall("Hello world".encode());
关于Python 3 套接字编程 : using sendall vs. sendto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40139775/
我在 udp 套接字客户端中调用 sendto,如下所示: if((num_w = sendto(cli_udp_sock, buffer, strlen(buffer), 0, (struct so
在 C 中使用 sendto() 时,我遇到了一个奇怪的问题。我有以下代码: struct sockaddr_in currSocket; int currSocketLength = sizeof(
我目前正在尝试在两台计算机之间设置 UDP 协议(protocol)。第一个是 Windows 驱动的计算机,第二个是带有 Raspbian 操作系统的 Raspberry Pi。 问题是我能够将信息
我正在为一个大学项目创建一个并发 UDP 套接字。客户端等待 stdin 命令,然后使用函数 child_job 创建一个新进程和一个新套接字。服务器接收来自客户端的命令,创建一个新进程来初始化新套接
我正在尝试在没有 tcp 有效负载的情况下进行客户端-服务器通信。我只是使用 tcp 的 header 作为有效负载字段,默认情况下为 20 字节。我刚刚意识到传输大文件时 CPU 使用率非常高,我尝
我尝试使用以下代码通过 UDP 发送,但得到了奇怪的结果。 if((sendto(newSocket, sendBuf, totalLength, 0, (SOCKADDR *)&sendAd
我有两个相互通信的程序。 客户端:先发送消息,然后监听回复。服务器:监听回复然后发送消息。 我能够完美地从客户端发送消息并在服务器中监听。但是当我尝试从服务器发送消息时出现问题。 struct hos
我目前正在处理一项网络作业。我们希望客户端自动获得分配给 TCP 套接字的 IP 和端口,并将 UDP 套接字绑定(bind)到与 TCP 套接字相同的地址和端口。这样,UDP 和 TCP 共享相同的
我有服务器和客户端通过 Windows 套接字发送/接收字符串。 客户端代码(发件人): string c = "Haha"; sprintf(temp.Buffer, c.c_str()); tem
您好,我有以下代码: if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) sin_family = AF_INET; sin->sin_port = htons(
我是 python(3.3) 网络编程的新手,所以一开始我尝试编写一个基本的跟踪路由程序。其中一行代码是: send_socket.sendto(512, '', (dest_name, port))
在我最近的项目中,我需要使用UDP协议(protocol)来传输数据。如果我使用 size = s.sendto(data, (, )) 发送数据,UDP协议(protocol)会保证数据打包成一个U
我有 2 个程序在运行(程序 1、程序 2),它们都使用我初始化的套接字相互发送和接收 UDP 数据包。 我的问题是,如果我从 program1 的 TRANSMIT(TX) 套接字发送广播,prog
ioctl(socketFd_, SIOCOUTQ, &outstandingBytes); getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBu
我正在编写一个通过套接字(从客户端到服务器)发送数据的应用程序。我观察到非常奇怪的行为:当我杀死服务器时,先发送然后杀死就像服务器存在一样。下一个返回 EPIPE。你能解释一下为什么吗? 这是来自客户
我有一个程序,它通过 UDP 接受坐标,移动一些设备,然后在工作完成时进行回复。 我似乎和这个人有同样的问题: Python sendto doesn't seem to send 我的代码在这里:
ssize_t sendto(int socket, const void *message, size_t length, int flags, const struct sockaddr *des
我如何以编程方式 (.net) 调用 Windows 资源管理器 SendTo 上下文菜单选项上的命令? 最佳答案 sendto 项是文件系统对象这一事实是一个实现细节,菜单由 sendto shel
我是 Python 的新手,正在尝试使用套接字将字节数组作为原始数据包发送。我的 IP 是 192.168.0.116,我要发送到的设备是 192.168.0.64。这个客户端设备是一个基于微 Con
在SendTo文件夹里加上一文件夹的快捷方式后,在右键发送到这个文件夹的是这些文件的一个副本,实际上是一个复制的过程,有时候我们只希望是快捷方式,那就得另想办法了。 把如下代码内容保存为sho
我是一名优秀的程序员,十分优秀!