Python Language
Sieć Python
Szukaj…
Uwagi
Najprostszy przykład klient-serwer z gniazdem Python
Po stronie serwera:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8089))
serversocket.listen(5) # become a server socket, maximum 5 connections
while True:
connection, address = serversocket.accept()
buf = connection.recv(64)
if len(buf) > 0:
print(buf)
break
Strona klienta:
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
clientsocket.send('hello')
Najpierw uruchom SocketServer.py i upewnij się, że serwer jest gotowy do nasłuchiwania / odbierania czegoś. Następnie klient wysyła informacje do serwera; Po otrzymaniu czegoś serwer kończy się
Tworzenie prostego serwera HTTP
Do udostępniania plików lub hostowania prostych stron internetowych (http i javascript) w sieci lokalnej można użyć wbudowanego modułu Pythona SimpleHTTPServer. Python powinien znajdować się w zmiennej Path. Przejdź do folderu, w którym znajdują się twoje pliki i wpisz:
W przypadku python 2
:
$ python -m SimpleHTTPServer <portnumber>
Dla python 3
:
$ python3 -m http.server <portnumber>
Jeśli nie podano numeru portu, domyślnym portem jest 8000
. Więc wynik będzie:
Obsługuje HTTP na porcie 0.0.0.0 8000 ...
Możesz uzyskać dostęp do swoich plików za pośrednictwem dowolnego urządzenia podłączonego do sieci lokalnej, wpisując http://hostipaddress:8000/
.
hostipaddress
to lokalny adres IP, który prawdopodobnie zaczyna się od 192.168.xx
Aby zakończyć moduł, naciśnij ctrl+c.
Tworzenie serwera TCP
Możesz utworzyć serwer TCP za pomocą biblioteki socketserver
. Oto prosty serwer echa.
Po stronie serwera
from sockerserver import BaseRequestHandler, TCPServer
class EchoHandler(BaseRequestHandler):
def handle(self):
print('connection from:', self.client_address)
while True:
msg = self.request.recv(8192)
if not msg:
break
self.request.send(msg)
if __name__ == '__main__':
server = TCPServer(('', 5000), EchoHandler)
server.serve_forever()
Strona klienta
from socket import socket, AF_INET, SOCK_STREAM
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(('localhost', 5000))
sock.send(b'Monty Python')
sock.recv(8192) # returns b'Monty Python'
socketserver
ułatwia tworzenie prostych serwerów TCP. Należy jednak pamiętać, że domyślnie serwery są jednowątkowe i mogą obsługiwać tylko jednego klienta na raz. Jeśli chcesz obsłużyć wielu klientów, zamiast tego ThreadingTCPServer
instancję ThreadingTCPServer
.
from socketserver import ThreadingTCPServer
...
if __name__ == '__main__':
server = ThreadingTCPServer(('', 5000), EchoHandler)
server.serve_forever()
Tworzenie serwera UDP
Serwer UDP można łatwo utworzyć za pomocą biblioteki socketserver
.
prosty serwer czasu:
import time
from socketserver import BaseRequestHandler, UDPServer
class CtimeHandler(BaseRequestHandler):
def handle(self):
print('connection from: ', self.client_address)
# Get message and client socket
msg, sock = self.request
resp = time.ctime()
sock.sendto(resp.encode('ascii'), self.client_address)
if __name__ == '__main__':
server = UDPServer(('', 5000), CtimeHandler)
server.serve_forever()
Testowanie:
>>> from socket import socket, AF_INET, SOCK_DGRAM
>>> sock = socket(AF_INET, SOCK_DGRAM)
>>> sick.sendto(b'', ('localhost', 5000))
0
>>> sock.recvfrom(8192)
(b'Wed Aug 15 20:35:08 2012', ('127.0.0.1', 5000))
Uruchom Simple HttpServer w wątku i otwórz przeglądarkę
Przydatne, jeśli Twój program wyświetla po drodze strony internetowe.
from http.server import HTTPServer, CGIHTTPRequestHandler
import webbrowser
import threading
def start_server(path, port=8000):
'''Start a simple webserver serving path on port'''
os.chdir(path)
httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
httpd.serve_forever()
# Start the server in a new thread
port = 8000
daemon = threading.Thread(name='daemon_server',
target=start_server,
args=('.', port)
daemon.setDaemon(True) # Set as a daemon so it will be killed once the main thread is dead.
daemon.start()
# Open the web browser
webbrowser.open('http://localhost:{}'.format(port))