2016-04-12 13 views
0

Ich versuche, Socket-Programmierung zu implementieren und die Kommunikationsportnummer für den Server und Client für einen bestimmten Port konfigurieren möchten. Ich gebe die gleiche Portnummer sowohl auf der Client- als auch auf der Serverseite an, aber immer noch, wenn der Programmlauf eine zufällige Portnummer benötigt. Wie repariere ich die Portnummer/mache sie statisch?Socket-Programmierung Port-Hilfe Python

Server Side-Code

import socket 
s=socket.socket() 
port=12345 
s.bind(("192.168.0.111",port)) 
s.listen(5) 
while True: 
    c, addr = s.accept() 
    print("got connection from ",addr) 
    sendingMessage = "Thank you for connecting" 
    c.send(bytes(sendingMessage, 'UTF-8')) 
    data = c.recv(16) 
    receivedData=data.decode("utf-8","ignore") 
    print (receivedData) 
    c.close() 
    if receivedData=="stop": 
     break 

Client Side-Code

import socket 
port=12345 
s=socket.socket() 
s.connect(("192.168.43.111",port)) 

sendingMessage = input("Enter your message : ") 
s.send(bytes(sendingMessage, 'UTF-8')) 

data = s.recv(32) 
receivedData=data.decode("utf-8","ignore") 
print (receivedData) 

s.close 
+0

Kann nicht reproduziert werden, tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN 25027/python – lapinkoira

+1

So funktionieren verbindungsorientierte Sockets. Der von Ihnen angegebene Port gilt nur für die erste Verbindung. Der zweite von accept() zurückgegebene Socket wird für die Konversation verwendet und verwendet einen "zufälligen" Port. – cdarke

+0

@cdarke Dies ist nicht korrekt. Sie erhalten einen anderen Socket mit 'accept', keinem anderen Port (auf der Serverseite). Um mehr als eine Verbindung vom Client zu akzeptieren, müsste der * Client * einen anderen Port für die Verbindung verwenden, da jedes 5-Tupel (TCP, IP1, Port1, IP2, Port2) eindeutig sein muss. –

Antwort

1

Wenn Sie die Client-Seite wollen auch Port verwenden, um 12.345, müssen Sie auch die Client-seitige Portnummer binden. Die Portnummer in s.connect ist der Remote-Port, mit dem Sie eine Verbindung herstellen. IOW, Ihr Code sollte in dem Client wie folgt aussehen:

s = socket.socket() 
s.bind(('', port)) 
s.connect(("192.168.43.111", port)) 

Sie können auch eine IP-Adresse in der Bindung angeben aber in der Regel brauchen Sie nicht als die lokale IP-Adresse wird durch die Route festgelegt werden, um der Remote-Host.

+0

Wenn ich den Client mit der gleichen Port-Nummer wie der Server binden, wird ein Fehler mit dem Namen s.bind ((192.168.0.112, Port)) OSError: [Errno 98] Adresse bereits verwendet –

+0

Sie können nicht ausgeführt werden beide auf demselben Rechner, wenn beide den gleichen Port binden. Wenn das auf einem anderen Computer ist, verwendet etwas anderes diesen Port. Probieren Sie netstat -apn aus, um herauszufinden, was es verwendet. –

+0

Danke =) es hat auf verschiedenen Rechnern funktioniert –