当前位置: 首页 > 知识库问答 >
问题:

简单套接字服务器基本了解

林念
2023-03-14

我是套接字编程新手,正在努力理解套接字是如何工作的。目前,我正在尝试使用python套接字库来了解它是如何工作的。

现在有几件事我无法理解。让我们举一个例子,如图所示,使用pythonsocket库用python编写一个简单的echo客户机和服务器。

echo服务器与下面的echo服务器类似。py导入套接字

host = ''        # Symbolic name meaning all available interfaces
port = 12345     # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
while True:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()

echo客户端如下所示

# echo_client.py
import socket

host = socket.gethostname()    
port = 12345                   # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.sendall(b'Hello, world')
data = s.recv(1024)
s.close()
print('Received', repr(data))

我的问题

>

是否有一些简单的实际例子来演示这一点?

共有2个答案

冯鸿光
2023-03-14

现在,当另一个客户端也连接到此服务器时会发生什么?conn和addr变量是否被新值覆盖?或者如何处理?

在你的例子中,没有什么有趣的事情会发生。连接的尝试将会失败。每个对link()的客户端调用都必须匹配对接受()的服务器调用。由于只调用接受()一次,至多会有一个客户端连接。

如果希望能够连续接受来自后续客户端的连接,请尝试以下操作:

import socket

host = ''        # Symbolic name meaning all available interfaces
port = 12345     # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
while True:
    conn, addr = s.accept()
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.sendall(data)
    conn.close()

如果您希望能够并行地接受来自客户端的连接,即同时来自多个客户端的连接,那么您有更多的工作要做。但这并不是你今天问题的一部分。

施驰
2023-03-14

现在,当另一个客户端也连接到此服务器时会发生什么?conn和addr变量是否被新值覆盖?或者如何处理?

正如Rob在另一个回答中指出的,您的代码将只接受一个客户机。对于来自客户端的任何连接请求,必须调用accept。并相应地编码。现在来回答您的问题,是的,(conn,addr)对将被覆盖。在再次调用accept进行新连接之前,代码应注意将它们传递到某个连接线程。

是否有一些简单的实际例子来演示这一点?有一些简单的实际例子来演示这个吗?

在接受多个客户端的更新代码中,尝试在几个连接后不调用接受,并注意传输控制协议状态表(例如,使用netstat)以查看不同积压值的行为。

 类似资料:
  • 问题内容: 有没有一种方法可以快速绑定到TCP端口/ ip地址,并简单地将所有信息打印到STDOUT?我有一个简单的调试解决方案,它可以将内容写入127.0.0.1:4444,并且我希望能够简单地从bash绑定端口并打印遇到的所有内容。是否有捷径可寻? 问题答案: 看到

  • 线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi

  • 问题内容: 我想使用asyncio协程而不是多线程来重新实现我的代码。 server.py client.py 我知道有一些适当的异步网络库可以做到这一点。但是我只想在这种情况下使用asyncio核心库,以便对其有更好的了解。 仅在处理客户端定义之前添加async关键字真是太好了……这里的一段代码似乎有效,但是我仍然对实现感到困惑。 asyncio_server.py 如何以最佳方式和使用异步aw

  • 我正在开发web套接字应用程序。从前端来看,每个应用程序都有一个插座。但我不确定后端。我们将Python和nginx与Flask socketIO和socket io客户端库一起使用。此体系结构将用于通知前端发生了更改,并应更新数据。 以下是我的疑问-服务器上将创建多少套接字和线程?不同连接之间是否可以共享套接字?是否有任何工具可以分析插座是否打开?

  • 问题内容: 错误2002(HY000):无法通过套接字’/var/run/mysqld/mysqld.sock’(2)连接到本地MySQL服务器 我尝试了在互联网上找到的所有内容,但是无法解决在Ubuntu 11.04上出现的问题。 我尝试了这些事情: 使用手动启动mysqld 使用启动mysqld 检查它是否正在使用并获得结果 在手动创建文件 授予用户权限 试图删除并重新安装,但仍然无法正常工作

  • 我希望我的访问者能够同时使用HTTP和HTTPS。我使用的是一个用Socket创建的简单Python webserver。我遵循了以下指南:Python Simple SSL Socket Server,但它没有那么大的帮助,因为如果证书在某个客户端中不可信,服务器就会崩溃。下面是运行服务器的webserver中的几行代码:def start(self):#create a socket obje