基本python套接字服务器应用程序不会产生预期的输出

基本python套接字服务器应用程序不会产生预期的输出,python,sockets,Python,Sockets,我试图用python编写一个基本的服务器/客户机应用程序,客户机将数字1-15发送到服务器,服务器在服务器端控制台上打印出来 客户代码: import socket clientsocket.connect(('localhost', 8303)) def updateX(): x = 0 while (x < 15): x clientsocket.send(format(x)) print x x = x+

我试图用python编写一个基本的服务器/客户机应用程序,客户机将数字1-15发送到服务器,服务器在服务器端控制台上打印出来

客户代码:

import socket
clientsocket.connect(('localhost', 8303))
def updateX():
    x = 0
    while (x < 15):
        x
        clientsocket.send(format(x))
        print x
        x = x+1

updateX()

在服务器处于活动状态时运行客户端的输出会导致无输出、仅打印1或仅打印12。想法?

在进入服务器端的主循环之前,您接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
但在循环本身中,您首先接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
因此,您从未从第一个连接读取数据。这就是为什么你看不到任何输出

还要注意的是,在每次迭代中接受一个新连接是错误的(对于您正在尝试做的事情)。即使您继续建立新的客户端连接,服务器也会在每次迭代时接受一个连接并从套接字读取一次,但随后继续下一次迭代并等待新的连接,永远不会读取客户端发送的更多数据。您应该对同一连接对象进行多个
recv
调用


您可能会发现有帮助。

在进入服务器端的主循环之前,您接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
但是在循环本身中,您首先接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
因此,您从未从第一个连接读取数据。这就是为什么你看不到任何输出

还要注意的是,在每次迭代中接受一个新连接是错误的(对于您正在尝试做的事情)。即使您继续建立新的客户端连接,服务器也会在每次迭代时接受一个连接并从套接字读取一次,但随后继续下一次迭代并等待新的连接,永远不会读取客户端发送的更多数据。您应该对同一连接对象进行多个
recv
调用


您可能会发现有帮助。

在进入服务器端的主循环之前,您接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
但在循环本身中,您首先接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
因此,您从未从第一个连接读取数据。这就是为什么你看不到任何输出

还要注意的是,在每次迭代中接受一个新连接是错误的(对于您正在尝试做的事情)。即使您继续建立新的客户端连接,服务器也会在每次迭代时接受一个连接并从套接字读取一次,但随后继续下一次迭代并等待新的连接,永远不会读取客户端发送的更多数据。您应该对同一连接对象进行多个
recv
调用


您可能会发现有帮助。

在进入服务器端的主循环之前,您接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
但在循环本身中,您首先接受一个连接:

connection, address = s.accept()
while True:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf
因此,您从未从第一个连接读取数据。这就是为什么你看不到任何输出

还要注意的是,在每次迭代中接受一个新连接是错误的(对于您正在尝试做的事情)。即使您继续建立新的客户端连接,服务器也会在每次迭代时接受一个连接并从套接字读取一次,但随后继续下一次迭代并等待新的连接,永远不会读取客户端发送的更多数据。您应该对同一连接对象进行多个
recv
调用


您可能会发现有帮助。

存在多个错误:

  • socket.send()可能只发送部分内容,请改用socket.sendall()
  • format(12)
    返回
    '12'
    ,因此,即使您的代码发送了所有数字并且服务器正确地接收到它们,它也会看到
    '01234567891011121314'
    ,即单个数字没有分开
  • double socket.accept()会导致忽略第一个连接
  • recv(64)返回的字节可能少于64个,您需要一个循环,直到它返回一个空的bytestring(意思是EOF)或use socket.makefile()
客户:

#!/usr/bin/env python
"""Send numbers in the range 0..14 inclusive as bytes e.g., 10 -> b'\n'

Usage: python client.py [port]
"""
import sys
import socket
from contextlib import closing

port = 8686 if len(sys.argv) < 2 else int(sys.argv[1])
with closing(socket.create_connection(('localhost', port))) as sock:
    sock.sendall(bytearray(range(15))) # send each number as a byte
    sock.shutdown(socket.SHUT_RDWR)    # no more sends/receives
#/usr/bin/env python
“”“以字节形式发送0..14范围内的数字,例如10->b'\n”
用法:python client.py[端口]
"""
导入系统
导入套接字
从上下文库导入关闭
如果len(sys.argv)<2 else int(sys.argv[1]),则端口=8686
关闭(socket.create_连接(('localhost',port)),作为sock:
sock.sendall(bytearray(范围(15))#以字节形式发送每个数字
sock.shutdown(socket.shutu RDWR)#不再发送/接收
您需要知道数据中的数字是如何分隔的。在这种情况下,使用固定格式:每个数字是一个单独的字节。它仅限于小于256的数字

以及相应的服务器:

#!/usr/bin/env python
"""
Usage: python server.py [port]
"""
from __future__ import print_function
import sys
import socket
from contextlib import closing

host = 'localhost'
port = 8686 if len(sys.argv) < 2 else int(sys.argv[1])

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # ipv4 version
try:
    s.bind((host, port))
    s.listen(5)
    print("listening TCP on {host} port {port}".format(**vars()))
    while True:
        conn, addr = s.accept()
        with closing(conn), closing(conn.makefile('rb')) as file:
            for byte in iter(lambda: file.read(1), b''):
                # print numerical value of the byte as a decimal number
                print(ord(byte), end=' ')
            print("") # received all input from the client, print a newline
except KeyboardInterrupt:
    print('Keyboard interrupt received, exiting.')
finally:
    s.close()
#/usr/bin/env python
"""
用法:python server.py[端口]
"""
来自未来导入打印功能
导入系统
导入套接字
从上下文库导入关闭
主机='localhost'
如果len(sys.argv)<2 else int(sys.argv[1]),则端口=8686
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#ipv4版本
尝试:
s、 绑定((主机、端口))
s、 听(5)
打印(“在{host}端口{port}上侦听TCP”。格式(**vars())
尽管如此:
conn,addr=s.accept()
关闭(conn),关闭(conn.makefile('rb'))作为文件:
对于iter中的字节(lambda:file.read(1),b“”):
#将字节的数值打印为十进制数
打印(ord(字节),结束=“”)
打印(“”)#收到客户端的所有输入,打印换行
除键盘中断外:
打印('接收到键盘中断,正在退出')
最后:
s、 关闭()

有多个错误:

  • socket.send()可能只发送部分内容,请改用socket.sendall()
  • format(12)
    返回
    '12'
    ,因此,即使您的代码发送了所有数字并且服务器正确地接收到它们,它也会看到
    '01234567891011121314'
    ,即单个数字没有分开
  • double socket.accept()会导致忽略第一个连接
  • socket.recv(64)返回的字节可能小于64字节