web-dev-qa-db-ja.com

基本的なPythonクライアントソケットの例

私は、ソケットがどのように機能するかについて頭をかき回そうとしており、非常に単純なクライアントソケットプログラム用に このページ で見つけたサンプルコードをいくつか選んでみました。これは基本的なサンプルコードであるため、エラーがないと想定しましたが、コンパイルしようとすると、次のエラーメッセージが表示されます。

Client_socket.connect(( 'localhost'、5000))のファイル "client.py"、行4、接続socket.errorのファイル ""、行1:[Errno 111]接続が拒否されました

私はこのエラーのほぼすべての部分をグーグルで調べましたが、同様の問題を抱えている人は、ポート番号を変更し、「バインド」の代わりに「接続」などを使用して助けられたようですが、それらは私の状況に当てはまりました。私はネットワークプログラミングが初めてで、Pythonはかなり新しいので、どんな助けも大歓迎です。

ところで、リンクが何らかの理由で機能しない場合のコードを次に示します。

#client example
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 5000))
while 1:
    data = client_socket.recv(512)
    if ( data == 'q' or data == 'Q'):
        client_socket.close()
        break;
    else:
        print "RECIEVED:" , data
        data = raw_input ( "SEND( TYPE q or Q to Quit):" )
        if (data <> 'Q' and data <> 'q'):
            client_socket.send(data)
        else:
            client_socket.send(data)
            client_socket.close()
            break;
61
dukbur

ポート5000で実行されているコンピューターに接続しようとしていますが、接続は拒否されています。実行中のサーバーがありますか?

そうでない場合は、テストに netcat を使用できます。

nc -l -k -p 5000

一部の実装では、-pフラグを省略する必要があります。

21
icktoofay

最も簡単なpythonソケットの例を次に示します。

サーバ側:

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

クライアント側:

import socket

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
clientsocket.send('hello')
  • 最初にSocketServer.pyを実行し、サーバーがsthをリッスン/受信する準備ができていることを確認します
  • 次に、クライアントはサーバーに情報を送信します。
  • サーバーはsthを受信した後、終了します
123
David

これは非常に単純なソケットプログラムです。これは、ソケットと同じくらい簡単です。

クライアントプログラム用(CPU 1)

import socket

s = socket.socket()
Host = '111.111.0.11' # needs to be in quote
port = 1247
s.connect((Host, port))
print s.recv(1024)
inpt = raw_input('type anything and click enter... ')
s.send(inpt)
print "the message has been sent"

4行目の111.111.0.11を2番目のコンピューターのネットワーク設定で見つかったIP番号に置き換える必要があります。

サーバープログラム用(CPU 2)

import socket

s = socket.socket()
Host = socket.gethostname()
port = 1247
s.bind((Host,port))
s.listen(5)
while True:
    c, addr = s.accept()
    print("Connection accepted from " + repr(addr[1]))

    c.send("Server approved connection\n")
    print repr(addr[1]) + ": " + c.recv(1026)
    c.close()

サーバープログラムを実行してから、クライアントプログラムを実行します。

23
Pyboss

クライアントが存在しないサーバーに接続しようとしているようです。シェルウィンドウで、次を実行します。

$ nc -l 5000

Pythonコードを実行する前に。接続先のポート5000でリッスンするサーバーとして機能します。次に、Pythonウィンドウに入力して、他の端末に表示されるか、その逆を見ることができます。

4
Kirk Strauser

実行からコンパイルを混乱させる可能性があります。 Pythonにはコンパイル手順がありません! :) python myprogram.pyと入力するとすぐにプログラムが実行され、場合によっては、開いているポート5000に接続しようとし、サーバープログラムがリッスンしていない場合はエラーが発生します。実行可能ファイルを生成するためにコンパイルが必要な2段階言語に慣れているようです。したがって、コンパイル時エラーで「ポート5000でリッスンしている人が見つかりません!」というPythonのランタイムコンパイルを混同しています。しかし、実際には、Pythonコードは問題ありません。実行する前にリスナーを呼び出すだけです!

3
Brandon Rhodes