2016-04-23 10 views
0

Bin neu auf dem Gebiet der Netzwerkprogrammierung, also dachte ich, Sockets wäre ein guter Anfang. Ich habe ein einfaches gemacht, aber es wirft immer wieder einen Fehler zurück.Ein einfacher Socket in Python-Probleme

dies ist der Fehler

Traceback (most recent call last): 
    File "/Users/mbp/Desktop/python user files/Untitled.py", line 3, in <module> 
    client_socket.connect(('localhost', 5000)) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth 
    return getattr(self._sock,name)(*args) 
error: [Errno 61] Connection refused 

die

import socket 
import os 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host=socket.gethostbyname('localhost') 
port=12345 
s.bind((host,port)) 

s.listen(5) 
print host 
while True: 
    c, addr = s.accept()  
    print 'Got connection from', addr 
    c.send('Thank you for connecting') 
    c.close() 

den Client

import socket 
import os  

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
host = '192.168.0.10' 
port = 12345     

s.connect((host, port)) 
print s.recv(1024) 
s.close   

Sein dienen nur, nachdem ich den Client ausführen, dass ich den Fehler. Es ist auch sehr wichtig, es an der Eingabeaufforderung auszuführen

+0

dem Client und dem dienen, sind in der gleiche Maschine. Ich will nur, dass es die Verbindung bestätigt. –

Antwort

1

Mit welchem ​​Server verbinden Sie? Der Server muss server_socket.accept() im Code haben, um die Verbindung zu akzeptieren. Wenn Sie nur Ihren Kunden anschauen, ist es schwer zu sagen.

um dir zu helfen, werde ich einen multy client chat anhängen, den ich in python geschrieben habe vielleicht kannst du etwas python daraus lernen es hat threading und multy client socket verbindung wenn das zu viel für dich ist habe ich etwas basischeres lassen Sie mich wissen, nur mit einem Kommentar

Server:

import socket 
import select 
import thread 
import random 
from datetime import date 

server_socket = socket.socket() 
server_socket.bind(('0.0.0.0', 8820)) 

server_socket.listen(5) 

open_client_sockets = [] 
open_client_sockets_with_name = [] 
message_to_send = [] 

new_name = "new" 

# recives a client socket and finds it in the list of open client sockets and returns its name 
def find_name_by_socket(current_socket): 
    for client_and_name in open_client_sockets_with_name: 
     (client_address, client_name) = client_and_name 
     if client_address == current_socket: 
      return client_name 

# this function takes a commend, executes it and send the result to the client 
def execute(cmd): 
    if cmd == "DATE": 
     current_socket.send(str(date.today())) 
    elif cmd == "NAME": 
     current_socket.send("best server ever") 
    elif cmd == "RAND": 
     current_socket.send(str(random.randrange(1,11,1))) 
    elif cmd == "EXIT": 
     current_socket.send("closing") 
     open_client_sockets.remove(current_socket) 
     open_client_sockets_with_name.remove((current_socket, find_name_by_socket(current_socket))) 
     current_socket.close() 
    else : 
     current_socket.send("there was an error in the commend sent") 

def send_waiting_message(wlist): 
    # sends the message that needs to be sent 
    for message in message_to_send: 
     (client_socket, name, data) = message 

     if data[0] != '`': 
      print name + ": " + data 
      for client in wlist: 
       if client_socket != client: 
        client.send(name + ": " + data) 
     else: # this will execute a command and not print it 
      print "executing... " + data[1:] 
      execute(data[1:]) 
     message_to_send.remove(message) 

while True: 
    ''' 
    rlist, sockets that you can read from 
    wlist, sockets that you can send to 
    xlist, sockets that send errors ''' 
    rlist, wlist, xlist = select.select([server_socket] + open_client_sockets,open_client_sockets , []) 
    for current_socket in rlist: 
     if current_socket is server_socket: 
      (new_socket, address) = server_socket.accept() 
      new_name = new_socket.recv(1024) 
      print new_name + " connected" 
      open_client_sockets.append(new_socket) 
      open_client_sockets_with_name.append((new_socket, new_name)) 
     else: 
      data = current_socket.recv(1024) 
      if data == "": 
       try: 
        open_client_sockets.remove(current_socket) 
        open_client_sockets_with_name.remove((current_socket, find_name_by_socket(current_socket))) 
       except: 
        print "error" 
       print "connection with client closed" 
      else: 

       message_to_send.append((current_socket, str(find_name_by_socket(current_socket)) , str(data))) 

    send_waiting_message(wlist) 

server_socket.close() 

Client:

import socket 
import threading 
global msg 

# recives input from the server 
def recv(): 
    while True: 
     try: # try to recive that data the the server is sending 
      data = client_socket.recv(1024) 
      print data 
     except: # the connection is closed 
      return 

# send user input to the server 
def send(): 
    while True: # store what the user wrote in the global variable msg and send it to the server 
     msg = raw_input("--- ") 
     client_socket.send(msg) 
     if msg == "`EXIT": 
      client_socket.close() 
      return 

name = raw_input("enter your name ") 
print "use ` to enter a commend" 

try: 
    client_socket = socket.socket()    # new socket 
    client_socket.connect(('127.0.0.1', 8820)) # connect to the server 
    client_socket.send(name)     # send the name to the server 

    # since receving the server's output and sending the user's input uses blocking functions it is required to run them in a separate thread 
    thread_send = threading.Thread(target = send) # creates the thread in charge of sending user input 
    thread_recv = threading.Thread(target = recv) # creates the thread in charge of reciving server output 

    thread_recv.start() # starts the thread 
    thread_send.start() # starts the thread 
except: 
    print "an error occurred in the main function" 
    client_socket.close() 
+0

danke, der Kunde und der Aufschlag sind mein PC, IOW sie sind die gleichen –

+0

das ist nicht das, was ich fragte, der Client und der Server auf Ihrem PC laufen, aber sie sind zwei verschiedene Seiten des Codes, wie es nicht möglich ist, dass die Der Client und der Server werden in der gleichen Datei geschrieben, die getrennt sein und separat ausgeführt werden muss. Ich muss den Code des Servers sehen, um das anfängliche Problem zu beheben –

+0

Jetzt sehe ich es tut mir leid, dass ich es verpasste das erste Mal, als ich Ihren Beitrag las (dumme Legasthenie). Ich denke, du musst hinzufügen() um Ihre 11. Zeile btw (c, addr) = s.accept() –

1

Der Server Sie beginnen nicht über das Add ress 192.168.0.10, eher ist es lokaler Host. Siehe die Adresse localhost, die gedruckt wird, wenn Sie server.py ausführen. Aktualisieren Sie die Hostvariable auf diese Adresse in client.py, wodurch das Problem behoben wird.

+0

wirft immer noch den gleichen Fehler –

+0

@mohamedurrdan Können Sie weitere Informationen zur Verfügung stellen? – letmutx

+0

Ich habe die IP-Adresse verwendet, die ich von localhost bekommen habe und sie in der Client-Datei verwendet habe, wie Sie vorgeschlagen haben, bekomme aber immer noch die gleiche Fehlermeldung –

0

Hier ist ein Beispiel für einen einfachen Befehlsserver: Wenn Sie den Servercode ausführen und dann den Client ausführen, können Sie den Client eingeben und an den Server senden. Wenn Sie TIME eingeben, erhalten Sie vom Server ein Respons, das eine Zeichenfolge enthält, die das Datum von heute hat, und die anderen Befehle funktionieren auf die gleiche Weise. Wenn Sie Ende geben wird es die Verbindung schließen und wird vom Server die Zeichenfolge schließt an den Client

Server senden:

import socket 
import random 
from datetime import date 


server_socket = socket.socket()       # new socket object 
server_socket.bind(('0.0.0.0', 8820))      # empty bind (will connect to a real ip later) 

server_socket.listen(1)         # see if any client is trying to connect 

(client_socket, client_address) = server_socket.accept() # accept the connection 
while True: # main server loop 
    client_cmd = client_socket.recv(1024)     # recive user input from client 
    # check waht command was entered 
    if client_cmd == "TIME": 
     client_socket.send(str(date.today()))    # send the date 
    elif client_cmd == "NAME": 
     client_socket.send("best server ever")   # send this text 
    elif client_cmd == "RAND": 
     client_socket.send(str(random.randrange(1,11,1))) # send this randomly generated number 
    elif client_cmd == "EXIT": 
     client_socket.send("closing") 
     client_socket.close()        # close the connection with the client 
     server_socket.close()        # close the server 
     break 
    else : 
     client_socket.send("there was an error in the commend sent") 

client_socket.close()          # just in case try to close again 
server_socket.close()          # just in case try to close again 

Client:

import socket 

client_socket = socket.socket()     # new socket object 
client_socket.connect(('127.0.0.1', 8820))   # connect to the server on port 8820, the ip '127.0.0.1' is special because it will always refer to your own computer 

while True: 
    try: 
     print "please enter a commend" 
     print "TIME - request the current time" 
     print "NAME - request the name of the server" 
     print "RAND - request a random number" 
     print "EXIT - request to disconnect the sockets" 
     cmd = raw_input("please enter your name") # user input 

     client_socket.send(cmd)     # send the string to the server 

     data = client_socket.recv(1024)   # recive server output 
     print "the server sent: " + data   # print that data from the server 
     print 
     if data == "closing": 
      break 
    except: 
     print "closing server" 
     break 

client_socket.close()        # close the connection with the server 
+0

Vielen Dank. Soll ich das Terminal benutzen oder so laufen wie es ist? –

+0

Nun, Sie können es trotzdem laufen lassen, aber ich empfehle, PyCharm https://www.jetbrains.com/pycharm/download/#section=windows herunterzuladen und dann alles, was Sie tun müssen, um ein Programm zu starten, ist mit der rechten Maustaste die Datei mit dem Code darin und klicken Sie auf Ausführen. Stellen Sie sicher, dass Sie Ihre Interpretereinstellungen unter Datei -> Einstellungen -> Projekt: "Projektname" -> Projekt Interpreter auf 2.7.x einstellen. –

+0

Ich habe PyCharm. Alles funktioniert jetzt wie Charme. Ich verstehe Sockets besser jetzt. Thanx –