2014-01-20 66 views
13

我有兩個腳本,Server.py和Client.py。 我有兩個目標:通過套接字發送字符串(python)

  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,所以請稍微詳細一點,如果可以的話,請給出整個事情的源代碼。

回答

18
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循環之前,您需要先接受客戶端(服務器端),因爲在每個循環中您接受一個新客戶端,或者按照我所描述的方式進行操作,將客戶端轉換爲您處理的單獨線程從現在起他自己。

+0

這是什麼代碼? –

+1

正是你所要求的,「像聊天應用程序的東西」。這是一個聊天應用程序。 你的'serversocket.accept()'接受一個套接字,將它傳遞到類'client()'這是一個線程。該線程將在你的'accept()'函數中運行,不會阻止其他人連接,同時仍然執行兩件事。 1)接收來自客戶端的數據。 2)在每封郵件中用「你給我發送了什麼東西」來回答客戶。 – Torxed

+1

@ user2670775另外,你可以使用你已經有的client.py,這個我寫的server.py也可以用你的客戶端代碼。 – Torxed

4

這段代碼不正確。

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

accept()serversocket塊的調用,直到有一個客戶端連接。當您首次從客戶端連接到服務器時,它會接受連接並接收數據。但是,當它再次進入循環時,它正在等待另一個連接並因此阻塞,因爲沒有其他客戶端嘗試連接。

這就是recv只在第一次才能正確工作的原因。你應該做的是找出如何處理與已被接受的客戶端的通信 - 也許通過創建一個新的線程來處理與該客戶端的通信,並繼續接受循環中的新客戶端,並以相同的方式處理它們。

提示:如果你想創建自己的聊天應用程序,你應該看看像Twisted這樣的網絡引擎。它也會幫助你更好地理解整個概念。

+0

那麼我應該如何修改它? 我必須修改客戶端和服務器嗎? –

+0

在您編寫的while循環中,只接受新客戶端的連接。您通常必須先使其成爲多線程,然後才能從客戶端讀取數據並將數據發回。 – gravetii

+0

我並不是真的在做一個聊天應用程序。我想接收和發送來自我的raspberryPi的數據。 好吧,假設我只是想要單向傳輸到服務器,那麼我該怎麼辦? –