Server.pyとClient.pyの2つのスクリプトがあります。私は2つの目的を念頭に置いています:
これが私のServer.pyです:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Host = "192.168.1.3"
port = 8000
print (Host)
print (port)
serversocket.bind((Host, port))
serversocket.listen(5)
print ('server started and listening')
while 1:
(clientsocket, address) = serversocket.accept()
print ("connection found!")
data = clientsocket.recv(1024).decode()
print (data)
r='REceieve'
clientsocket.send(r.encode())
ここに私のクライアントがあります:
#! /usr/bin/python3
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Host ="192.168.1.3"
port =8000
s.connect((Host,port))
def ts(str):
s.send('e'.encode())
data = ''
data = s.recv(1024).decode()
print (data)
while 2:
r = input('enter')
ts(s)
s.close ()
この関数は初めて機能します( 'e'はサーバーに戻り、返信メッセージが返されます)が、それを何度も繰り返します(チャットアプリケーションのようなもの)。問題は最初の後に始まります。メッセージは最初の後には送られません。私は何を間違えていますか?私はpythonを初めて使用するので、少し詳しく説明してください。できれば、すべてのソースコードを教えてください。
import socket
from threading import *
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Host = "192.168.1.3"
port = 8000
print (Host)
print (port)
serversocket.bind((Host, port))
class client(Thread):
def __init__(self, socket, address):
Thread.__init__(self)
self.sock = socket
self.addr = address
self.start()
def run(self):
while 1:
print('Client sent:', self.sock.recv(1024).decode())
self.sock.send(b'Oi you sent something to me')
serversocket.listen(5)
print ('server started and listening')
while 1:
clientsocket, address = serversocket.accept()
client(clientsocket, address)
これは、解決方法が非常にシンプルなデザインです。最初に、すべてのループで新しいクライアントを受け入れるため、while 1
ループに入る前にクライアント(サーバー側)を受け入れる必要があります。これから自分で処理します。
このコードは正しくありません。
while 1:
(clientsocket, address) = serversocket.accept()
print ("connection found!")
data = clientsocket.recv(1024).decode()
print (data)
r='REceieve'
clientsocket.send(r.encode())
serversocket
のaccept()
の呼び出しは、クライアント接続があるまでブロックします。クライアントからサーバーに初めて接続すると、接続を受け入れてデータを受信します。ただし、ループに入ると、別の接続を待機しているため、接続しようとしている他のクライアントがないためブロックします。
それが、recv
が初めて正しく動作する理由です。あなたがすべきことは、受け入れられたクライアントとの通信を処理する方法を見つけることです-そのクライアントとの通信を処理する新しいスレッドを作成し、ループ内で新しいクライアントを受け入れ続け、同じようにそれらを処理することによって。
ヒント:独自のチャットアプリケーションの作成に取り組む場合は、Twistedなどのネットワークエンジンを検討する必要があります。コンセプト全体をよりよく理解するのにも役立ちます。
client.py
import socket
s = socket.socket()
s.connect(('127.0.0.1',12345))
while True:
str = raw_input("S: ")
s.send(str.encode());
if(str == "Bye" or str == "bye"):
break
print "N:",s.recv(1024).decode()
s.close()
server.py
import socket
s = socket.socket()
port = 12345
s.bind(('', port))
s.listen(5)
c, addr = s.accept()
print "Socket Up and running with a connection from",addr
while True:
rcvdData = c.recv(1024).decode()
print "S:",rcvdData
sendData = raw_input("N: ")
c.send(sendData.encode())
if(sendData == "Bye" or sendData == "bye"):
break
c.close()
これは、必要なチャットアプリの小さなプロトタイプのコードになります。両方を別々の端末で実行しますが、ポートを確認するだけです。