ここに私がする必要があるものがあります
ソケットモジュールを使用するPythonプログラムを作成します。 クライアントとサーバーを作成します。 クライアントは整数を読み取り、その整数をサーバーに送信します。 サーバーは整数が素数かどうかをテストし、クライアントにTrueまたはFalseを返します。 サーバーは、整数を受け取ったことと、受け取った整数を出力します。 その後、クライアントは報告します(たとえば) 「サーバーは17がプライムだと言います」または 「サーバーは18がプライムではないと言います」 次に、クライアントはテストする別の整数を要求します。 これは、ユーザーが0を入力するまで続きます。
そして、ここに私がこれまで持っているものがあります
サーバースクリプト
#!/usr/bin/python
import socket
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsocket.bind( ("0.0.0.0", 8000) )
tcpsocket.listen(2)
(client, (ip,port) ) = tcpsocket.accept()
value = int(client.recv(2048))
MESSAGE1 = "The number %s is not a prime number" %value
MESSAGE2 = "The number %s is a prime number" %value
print "received connection from %s" %ip
print " port is number %d" %port
print " number value received is number %d" %value
for i in range(2,value):
if (value % i) == 0:
client.send(MESSAGE1)
else:
client.send(MESSAGE2)
クライアント側
#!/usr/bin/python
import socket
import sys
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
num = []
while num != 0 :
num = raw_input("Enter number: ")
tcpsocket.connect( ("192.168.233.132", 8000) )
tcpsocket.send(num)
print tcpsocket.recv(2048)
tcpsocket.close()
だから、これは1つの番号でうまくいくようですが、ループに入れると2番目の番号を要求しますが、このエラーが発生します
Enter number: 3
The number 3 is a prime number
Enter number: 2
Traceback (most recent call last):
File "./socketclient.py", line 14, in <module>
tcpsocket.connect( ("192.168.233.132", 8000) )
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
File "/usr/lib/python2.7/socket.py", line 170, in _dummy
raise error(EBADF, "Bad file descriptor")
socket.error: [Errno 9] Bad file descriptor
私は十分近いですが、ユーザーが0を入力するまで実行し続ける必要があります
何か案は ?
回答:
回答№1は02つの問題があります。
まず、サーバーは1つだけを受け入れます接続しますが、クライアントはループを通じて毎回新しい接続を確立しようとしています。したがって、ループの最初の反復は機能しますが、サーバーは別の接続を受け入れることはありません。これを修正するには、 tcpsocket.connect()
ループ前に、しかし、あなたは2番目の問題に遭遇する可能性があります。
2番目の問題は、TCPがデータをバイトストリームとして送信することです。データは、送信とは異なるサイズのチャンクで受信できます。たとえば、ループが実行される場合 tcpsocket.send("3")
その後 tcpsocket.send("5")
、サーバーへの呼び出し client.receive(2048)
「35」を返す可能性があります。 (上記のクライアントでは、呼び出しの遅延のため、これはほとんどありません send
人間の入力を使用しているため、サーバーまた、「12345」の送信は「123」、次に「45」として受信できます。TCPの場合、メッセージの終わりを検出するためのプロトコルを定義する必要があります。区切り文字としてのcharは一般的なものです。