通过套接字发送字符串(python)

时间:2014-01-20 11:52:41

标签: python sockets networking

我有两个脚本,Server.py和Client.py。 我有两个目标:

  1. 能够从客户端一次又一次地向服务器发送数据。
  2. 能够将数据从服务器发送到客户端。
  3. 这是我的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的新手,所以请稍微详细一点,如果可以,请提供整个内容的源代码。

3 个答案:

答案 0 :(得分:31)

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循环之前接受客户端(服务器端),因为在每个循环中您接受一个新客户端,或者您按照我的描述执行操作,您将客户端扔到一个单独的线程中你从现在开始独自处理。

答案 1 :(得分:5)

这段代码不正确。

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第一次正常工作的原因。您应该做的是找出如何处理与已被接受的客户端的通信 - 可能通过创建一个新的线程来处理与该客户端的通信并继续接受循环中的新客户端,以相同的方式处理它们。 / p>

提示:如果您想创建自己的聊天应用程序,您应该看一下像Twisted这样的网络引擎。它也将帮助您更好地理解整个概念。

答案 2 :(得分:2)

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

这应该是您想要的聊天应用程序的小型原型的代码。 分别在单独的终端中运行它们,然后只需检查端口即可。