2017-03-05 10 views
5

ローカルマシン上でポートを開き、他の人がnetcat経由で接続できるようにするプログラムを作成しようとしています。私の現在のコードはです。PythonソケットエラーTypeError:send関数で 'str'ではなくバイト型オブジェクトが必要です

s = socket.socket() 
host = '127.0.0.1' 
port = 12345 
s.bind((host, port)) 

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

私はPythonとソケットが初めてです。

nc 127.0.0.1 12345 

しかし、その後、私のPythonスクリプトに私はc.sendのエラーを取得:

TypeError: a bytes-like object is required, not 'str' 

私を、私はこのコードを実行するときしかし、それは私がコマンドでnetcatを接続を送信することができます基本的にはポートをオープンしようとしています.netcatが接続し、そのマシンにフル・シェルを持つことができます。

+0

まだエンコードを試しましたか? –

+0

いいえ、私はc.sendをコメントアウトして実行できます。文字列をコード化する必要があると思いますか? – sqlsqlsql

答えて

9

このエラーの理由は、Python 3では文字列がUnicodeですが、ネットワーク上で送信する場合、データはバイト文字列である必要があります。だから... ...提案のカップル:

  1. を使用すると、1つの呼び出し(docsを参照)で全体のMSGを送信していない可能性のある問題を防ぐためにc.sendall()代わりのc.send()を使用して提案します。
  2. リテラルの場合は、バイト文字列のための'b'を追加します。

    output = 'Thank you for connecting' 
    c.sendall(output.encode('utf-8')) 
    

    c.sendall(b'Thank you for connecting')

  3. が変数の場合、あなたは文字列(下記参照)

ベストソリューションをバイトをUnicode文字列をエンコードする必要がありますエピローグ/背景:文字列がすでにバイト文字列であるため、これはPython 2では問題ではありません。あなたのOPコードはその環境で完全に動作します。 Unicode文字列はPython 1.6/2.0で追加され、デフォルト文字列型になったときには3.xまで後ろに座っていました。また、this questionを参照してください。

+1

ありがとうございます。これは非常に役に立ち、私の質問にも答えます。 – sqlsqlsql

0

あなたはこれに送信ラインを変更することができます。

c.send(b'Thank you for connecting') 

bが、それは代わりにバイトになります。

+0

ありがとう、トリックでした! – sqlsqlsql

4

receive.decode('utf_8')でstrにデコードすることができます。

関連する問題