Windows select()只接收,不发送

2024-04-16 13:43:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我让我的Windows计算机连接到我的linux python服务器。你知道吗

这个服务器对于linux用户来说运行得非常好,但是我希望它也能在Windows上运行。我做了一些研究,发现选择。选择()函数在没有stdin管道的情况下工作,但当我这样做时,它不会向服务器发送任何数据,只接收数据。你知道吗

代码:

 __author__ = 'root'
import socket
import datetime
import getpass          # Get username
import sys
import threading
import thread
import select

def client():

   sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   address = "192.168.1.17"
   sock.bind((str("192.168.1.231"), int(2222)))
   sock.connect(("192.168.1.17", int(23657)))
   sock.setblocking(0)
   sock.send(getpass.getuser()+"[$ID$]zivofek")

   socket_list = [sys.stdin, sock]
   partner = raw_input("Chat partner: ")

   while 1:
       try:
           message = raw_input()
           sock.sendall(message)
           data = sock.recv(1024)
           print data
       except:
           continue

def get_time():
   return datetime.datetime.strftime(datetime.datetime.now(), '%H:%M:%S')

def main():
   client()

if __name__ == "__main__":
   main()

你知道如何在Windows下同时收发吗?你知道吗


Tags: import服务器clientpartnerdatetimemainlinuxwindows
2条回答

不要将套接字设置为非阻塞,除非您真的想多路传输来自不同来源的事件(即不使用select())。你知道吗

这里只需要普通的阻塞sendall()就可以了。还要检查recv()的返回长度—当一些数据可用时返回,接收到零字节意味着另一端关闭了连接。你知道吗

同样,不要在客户端TCP套接字上设置bind()SO_REUSEADDR。你知道吗

socket_list = [sys.stdin, sock]

假设上面的套接字列表的目的是将其传递给select()。。。这是行不通的。select()的Windows实现仅适用于套接字,并且系统标准不是套接字。你知道吗

这个问题没有简单的解决方法,也就是说,解决这个问题的一种方法是阅读文章系统标准在一个单独的线程中,让该线程()将数据发送到连接的套接字对的一端,并将套接字对的另一端放入要传递给select()的列表中。或者,您可以在select()中设置一个超时,以便select()每隔一段时间返回一次,让偶数循环check来查看stdin上是否有可用的字节(尽管这种机制要么CPU效率低,要么延迟时间长,根据传递给select()的超时值,是否可以接受取决于特定的使用场景)

(*)好的,有一个简单的解决方法:不用费心在Windows中运行程序。。。;)

相关问题 更多 >