2016-04-23 14 views
0

私はネットワークプログラミングの分野に新しいので、私はソケットが開始するには良い場所だと思った。私はシンプルなものを作りましたが、それはエラーを投げ返し続けます。シンプルなソケットのpythonのトラブル

これはエラー

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 

私はエラーを取得するクライアントを実行

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

クライアント

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   

その後にのみ機能します。コマンドプロンプトでそれを実行するのも大変です

+0

クライアントとサーブはしているが同じマシン。私はちょうどそれが接続を確認したい。 –

答えて

1

どのサーバーに接続していますか?接続を受け入れるには、コードにserver_socket.accept()が必要です。あなたのクライアントだけを見てから、それを伝えるのは難しいです。

あなたが私が多分Pythonで書いたマルチクライアントのチャットを添付してくれるかもしれないかもしれません。多分あなたのために多すぎる場合は、スレッドとマルチクライアントのソケット接続を持っています。ちょうど私がコメントで知らせて

サーバー:

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

クライアント:

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

ありがとう、クライアントとサーバは私のPCです、彼らは同じです –

+0

私は、クライアントとサーバ上で実行しているクライアントではないが、彼らはコードの2つの異なるページです。クライアントとサーバーは、別々のファイルとして別々に実行する必要があります。最初の問題を修正するのに役立つサーバーのコードを参照する必要があります –

+0

私はあなたがあなたのポスト(愚かな失読症)を読むのを初めて忘れてしまって申し訳ありません。私はあなたが11行目のbtw(c、addr)= s.accept()を追加する必要があると思います。 –

1

あなたはアドオンを持っていない始めているサーバーress 192.168.0.10ではなく、ローカルホストです。 server.pyを実行するときに表示されるlocalhostのアドレスを参照してください。問題を修正するアドレスclient.pyのホスト変数を更新してください。

+0

はまだ同じエラーを投げます。 –

+0

@mohamedurrdan詳細情報を提供できますか? – letmutx

+0

私はlocalhostから取得したIPを使用し、クライアントのファイルで使用していますが、同じエラーメッセージが表示されています。 –

0

単純なコマンドサーバーの例を次に示します。 サーバーコードを実行してクライアントを実行すると、クライアントに入力してサーバーに送信できるようになります。 TIMEと入力すると、サーバーから今日の日付を持つ文字列を含む応答を取得し、他のコマンドは同じ方法で動作します。あなたはEXITを入力した場合、それは接続を閉じ、サーバーからクライアント

サーバーに閉じた文字列お送りします:

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 

がクライアント:

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

ありがとうございました。ターミナルを使用するか、そのまま実行する必要がありますか? –

+0

とにかくそれを実行することができますが、PyCharm https://www.jetbrains.com/pycharm/download/#section=windowsをダウンロードすることをお勧めします。次に、プログラムを実行するために必要なのは、右クリックすることですコードを含むファイルをクリックして実行します。インタプリタの設定をファイル - >設定 - >プロジェクト: "プロジェクト名" - >プロジェクトインタプリタで2.7.xに設定してください。 –

+0

私はPyCharmを持っています。すべてが今、魅力のように機能します。私はソケットbetter.thanx –

関連する問題