Python 建立出站连接
我最近一直在修补python套接字模块,遇到了一个问题。 这是我的python服务器端脚本(我使用的是python3.8.2) 我的服务器端脚本运行正常,但是当我运行客户端脚本时Python 建立出站连接,python,python-3.x,sockets,networking,Python,Python 3.x,Sockets,Networking,我最近一直在修补python套接字模块,遇到了一个问题。 这是我的python服务器端脚本(我使用的是python3.8.2) 我的服务器端脚本运行正常,但是当我运行客户端脚本时 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((socket.gethostname(127.0.0.1), 0)) msg = s.recv(1024) print(msg.decode("utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(127.0.0.1), 0))
msg = s.recv(1024)
print(msg.decode("utf-8"))
我得到以下信息:
File "client.py", line 3
s.connect((socket.gethostname(127.0.0.1), 0))
^
SyntaxError: invalid syntax
raceback (most recent call last):
File "client.py", line 3, in <module>
s.connect(socket.gethostname((LAPTOP-XXXXXXX), 0))
NameError: name 'LAPTOP' is not defined
我已尝试将IP更改为我的计算机主机名,并给出以下信息:
File "client.py", line 3
s.connect((socket.gethostname(127.0.0.1), 0))
^
SyntaxError: invalid syntax
raceback (most recent call last):
File "client.py", line 3, in <module>
s.connect(socket.gethostname((LAPTOP-XXXXXXX), 0))
NameError: name 'LAPTOP' is not defined
raceback(最近一次通话最后一次):
文件“client.py”,第3行,在
s、 连接(socket.gethostname((笔记本电脑-XXXXXXX),0))
NameError:未定义名称“LAPTOP”
将127.0.0.1作为字符串放入gethostname中存在多个问题:
- 指定IP地址和主机名时,必须将其格式化为字符串(例如
和“127.0.0.1”
)。在不带引号的情况下指定它们会导致Python尝试将它们解释为其他标记,例如变量名、保留关键字、数字等,这会导致错误,例如SyntaxError和NameError“LAPTOP-XXXXXXX”
- 不接受争论
- 在
调用中指定端口0会导致分配一个随机的高编号端口,因此您需要对使用的端口进行硬编码,或者在客户端中动态指定正确的端口(例如,通过在执行程序时将其指定为参数)socket.bind()
- 在服务器代码中,
可能不会使用环回地址。这里的一个选项是使用socket.gethostname()
import socket
HOST = ''
PORT = 45555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
host_addr = s.getsockname()
print("listening on {}:{}".format(host_addr[0], host_addr[1]))
s.listen(5)
while True:
client_socket, client_addr = s.accept()
print("connection from {}:{} established".format(client_addr[0], client_addr[1]))
client_socket.send(bytes("welcome to the server!", "utf-8"))
import socket
HOST = '127.0.0.1'
PORT = 45555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
msg = s.recv(1024)
print(msg.decode("utf-8"))
client.py
import socket
HOST = ''
PORT = 45555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
host_addr = s.getsockname()
print("listening on {}:{}".format(host_addr[0], host_addr[1]))
s.listen(5)
while True:
client_socket, client_addr = s.accept()
print("connection from {}:{} established".format(client_addr[0], client_addr[1]))
client_socket.send(bytes("welcome to the server!", "utf-8"))
import socket
HOST = '127.0.0.1'
PORT = 45555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
msg = s.recv(1024)
print(msg.decode("utf-8"))
来自服务器的输出:
$ python3 server.py
listening on 0.0.0.0:45555
connection from 127.0.0.1:51188 established
connection from 127.0.0.1:51244 established
来自客户端的输出:
$ python3 client.py
welcome to the server!
$ python3 client.py
welcome to the server!
在
/etc/hosts
文件内容中,您将有一个带有“127.0.1.1”的IP地址映射到主机名。这将导致名称解析为127.0.1.1。请评论这句话。因此,局域网中的每个人都可以在与ip(192.168.1.*)连接时接收数据。使用threading
管理多个客户端
以下是服务器和客户端代码:
服务器代码:
import socket
import os
from threading import Thread
import threading
import time
import datetime
def listener(client, address):
print ("Accepted connection from: ", address)
with clients_lock:
clients.add(client)
try:
while True:
client.send(a)
time.sleep(2)
finally:
with clients_lock:
clients.remove(client)
client.close()
clients = set()
clients_lock = threading.Lock()
host = socket.getfqdn() # it gets ip of lan
port = 10016
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(3)
th = []
print ("Server is listening for connections...")
while True:
client, address = s.accept()
timestamp = datetime.datetime.now().strftime("%b %d %Y,%a, %I:%M:%S %p")
a = ("Hi Steven!!!" + timestamp).encode()
th.append(Thread(target=listener, args = (client,address)).start())
s.close()
客户端代码:
import socket
import os
import time
s = socket.socket()
host = '192.168.1.43' #my server ip
port = 10016
print(host)
print(port)
s.connect((host, port))
while True:
print((s.recv(1024)).decode())
s.close()
输出:
(base) paulsteven@smackcoders:~$ python server.py
Server is listening for connections...
Accepted connection from: ('192.168.1.43', 38716)
(base) paulsteven@smackcoders:~$ python client.py
192.168.1.43
10016
Hi Steven!!!Feb 19 2020,Wed, 11:13:17 AM
Hi Steven!!!Feb 19 2020,Wed, 11:13:17 AM
Hi Steven!!!Feb 19 2020,Wed, 11:13:17 AM
谢谢你的帮助!阅读了你的代码后,我对它有了更好的理解,但我对以下几行感到困惑:
print({}:{}).format(host_addr[0],host_addr[1])
。我想可能是{}:{}正在以某种方式指定ip和端口,但我不确定host_addr[0]和host_addr[1]在代码返回中也引用了什么。因此host_addr[0]
和host_addr[1]
引用该元组的第一个和第二个元素。关于{}
在字符串中,这些占位符由传递给的参数替换。