簡體   English   中英

Python套接字:如何獲取客戶端連接的地址?

[英]Python sockets: How do I get the address a client is connected to?

我有一些托管本地服務器的代碼,當用戶連接時它將向他們發送一些html代碼,效果很好。 但是我想要這樣,如果他們連接到http:// localhost:90 / abc ,它將顯示不同的內容。 如何獲得他們連接的確切網址?

這是我的代碼:

import socket

sock = socket.socket()
sock.bind(('', 90))
sock.listen(5)

print("Listening...")

while True:

    client, address = sock.accept()

    print("Connection recieved: ", address)
    print(The exact url they connected to.)
    print()

    client.send(b'HTTP/1.0 200 OK\r\n')
    client.send(b"Content-Type: text/html\r\n\r\n")
    client.send(b'<html><body><h1>Hello, User!</body></html>')
    client.close()


sock.close()

我嘗試了print(client.getpeername()[1]) ,但是那會獲得客戶端ip,如果有類似的方法來獲取ip,他們可能會連接到它的abc部分。

提前致謝。

套接字沒有URL的概念,該概念特定於在socket之上運行的HTTP協議。 因此,創建套接字時甚至只使用HTTP URL的一部分。

|--1---|----2----|-3-|--4-|
http:// localhost :90 /abc
  1. 指定URL使用TCP 的哪個協議
  2. 通過IP地址或主機名指定遠程主機
  3. 指定遠程端口,並且是可選的
  4. 指定URL的路徑

但是,TCP套接字實際上僅知道第2部分和第3部分! 這是因為TCP是一種非常基本的通信形式,HTTP在其之上添加了很多功能,例如請求,響應和路徑等。

基本上,如果您要實現HTTP服務器,那么知道/ abc部分就是您的工作。 看一下這個例子 客戶端實際上將/ abc部分發送到服務器,否則無法知道請求的路徑。

當客戶端連接到您的服務器時,它將發送:

GET /abc HTTP/1.1
Host: localhost
more headers...
<blank line>

您的服務器需要解析GET行並從中提取/abc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM