Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 建立出站连接_Python_Python 3.x_Sockets_Networking - Fatal编程技术网

Python 建立出站连接

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"))

我最近一直在修补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")) 
我得到以下信息:

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”
    “LAPTOP-XXXXXXX”
    )。在不带引号的情况下指定它们会导致Python尝试将它们解释为其他标记,例如变量名、保留关键字、数字等,这会导致错误,例如SyntaxError和NameError
  • 不接受争论
  • socket.bind()
    调用中指定端口0会导致分配一个随机的高编号端口,因此您需要对使用的端口进行硬编码,或者在客户端中动态指定正确的端口(例如,通过在执行程序时将其指定为参数)
  • 在服务器代码中,
    socket.gethostname()
    可能不会使用环回地址。这里的一个选项是使用
下面是一个有效的实现:

server.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"))
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]
引用该元组的第一个和第二个元素。关于
{}
在字符串中,这些占位符由传递给的参数替换。