web-dev-qa-db-ja.com

ソケットを介した文字列の送信(Python)

Server.pyとClient.pyの2つのスクリプトがあります。私は2つの目的を念頭に置いています:

  1. クライアントからサーバーに何度もデータを送信できるようにするため。
  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を初めて使用するので、少し詳しく説明してください。できれば、すべてのソースコードを教えてください。

27
harveyslash
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ループに入る前にクライアント(サーバー側)を受け入れる必要があります。これから自分で処理します。

32
Torxed

このコードは正しくありません。

while 1:
    (clientsocket, address) = serversocket.accept()
    print ("connection found!")
    data = clientsocket.recv(1024).decode()
    print (data)
    r='REceieve'
    clientsocket.send(r.encode())

serversocketaccept()の呼び出しは、クライアント接続があるまでブロックします。クライアントからサーバーに初めて接続すると、接続を受け入れてデータを受信します。ただし、ループに入ると、別の接続を待機しているため、接続しようとしている他のクライアントがないためブロックします。

それが、recvが初めて正しく動作する理由です。あなたがすべきことは、受け入れられたクライアントとの通信を処理する方法を見つけることです-そのクライアントとの通信を処理する新しいスレッドを作成し、ループ内で新しいクライアントを受け入れ続け、同じようにそれらを処理することによって。

ヒント:独自のチャットアプリケーションの作成に取り組む場合は、Twistedなどのネットワークエンジンを検討する必要があります。コンセプト全体をよりよく理解するのにも役立ちます。

5
gravetii

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()

これは、必要なチャットアプリの小さなプロトタイプのコードになります。両方を別々の端末で実行しますが、ポートを確認するだけです。

2
Nischaya Sharma