0

サーバーの例を使用しようとしていますが、クライアントは 1 つのメッセージしか送信できず、サーバーは番号で応答します。

これがコードです。

import socket
mySocket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
mySocket.bind ( ( '', 2000 ) )
mySocket.listen ( 1 )
while True:
   channel, details = mySocket.accept()
   print 'We have opened a connection with', details
   print channel.recv ( 100 )
   channel.send ( 'Green-eyed monster.' )
   channel.close()

質問:

  1. クライアントがサーバーにメッセージを送信するたびに、番号で応答するのはなぜですか?

  2. LAN 経由ではなく、インターネット経由でソケットを使用するにはどうすればよいですか?

  3. IMプログラムのように、サーバーがソケットを使用してクライアントからクライアントにデータを移動する方法はありますか。

  4. 私はこの IM サーバーを友人のために私の Mac でホストする可能性が高いです。OS 間 (Mac、PC) で動作しますか?

  5. これに使用する良いライブラリはありますか? (HTTPは素晴らしいと聞いたことがあります)

  6. これらのコード行は非常に紛らわしいです。それらはどのように機能しますか?

    print channel.recv ( 100 )
    channel.send ( 'Green-eyed monster.' )
    
  7. また、サーバーを閉じて (赤い X を使用)、ポートを再利用すると、次のように表示されます。

    Traceback (most recent call last):
    File "C:\Users\****\Desktop\Python\Sockets\First Server\server.py",
    line 3, in <module>
    mySocket.bind ( ( '', 2003 ) )
    File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
    error: [Errno 10048] Only one usage of each socket address
    (protocol/network address/port) is normally permitted
    
  8. 最後に、これをよりよく理解するための優れたチュートリアルはどこにありますか?

同じ投稿で多くの質問をして申し訳ありませんが、私がこれを投稿したとき人々は別の問題で同様の問題について投稿したことで私に腹を立てました.

Python バージョン: Python 2.7.3

4

1 に答える 1

0

私はいくつかの調査を行い(時間以上)、私の問題に対するいくつかの解決策を見つけました!

3:はい、クライアント同士が通信する方法があります。クライアントはサーバーを使用するだけです。データを受信して​​送信するサーバー側で無限ループを初期化する必要があります。これが私が問題を解決した方法です:

    while True:
        #Receiving from client
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
        print data
        #To come out of the loop
    conn.close()

このプログラムは、クライアントとのすべての接続を初期化するclientthreadと呼ばれる定義の一部です。「実際の」ループは、残りのスレッドを実行します。

     while True:
        #Wait to accept a connection - blocking call
        conn, addr = s.accept()
        #display client information (IP address)
        print 'Connected with ' + addr[0] + ':' + str(addr[1])

        #Start new thread takees 1st argument as a function name to be run, second
        #is the tuple of arguments to the function

        start_new_thread(clientthread ,(conn,))

4:はい、OS 間で動作します。ソケットはプラットフォームに依存しません。

6:このコード行は、実際には非常に単純です。この行print channel.recv ( 100 )は、ユーザー入力を最大 100 文字で出力するようにサーバーに指示します。次の行channel.send ( 'Green-eyed monster.' )は、クライアントにメッセージを送信するようにサーバーに指示するだけGreen-eyed monsterです。

7:このエラーは、ポートごとに複数のソケットを開くことができないために発生します。ポートを閉じるには、コードの最後にs.close()またはなどの行を使用することをお勧めします。sys.exit()または、単に別のものを選択することもできます!

8:インターネット上には素晴らしいチュートリアルがいくつかあります。ソケットの基本を教えてくれるのはthisです。Telnet は私にとって非常に紛らわしいものでした。そのため、このクライアントと組み合わせることで、実際にははるかに優れたカスタマイズされたクライアントを作成できることを発見しました。

ご不明な点がございましたら、お気軽にコメントいただければお答えいたします。

于 2013-02-09T09:59:01.960 に答える