如何从客户端套接字获取信息并在服务器上显示信息?

Posted

技术标签:

【中文标题】如何从客户端套接字获取信息并在服务器上显示信息?【英文标题】:How to get information from a client socket and display information on a server? 【发布时间】:2021-12-11 04:33:04 【问题描述】:

如何强制服务器接收来自客户端的消息并显示消息:“name send message: data”?例如,一个用户向另一个用户发送消息,当一个名为 John 的用户发送消息“Hello Alice,你好吗?”时,服务器会在此时显示 - John 会发送消息:Hello Alice,how你是?我会很感激你的帮助。 我希望能在这篇文章中找到这个问题的答案。代码如下:

服务器:

import threading
import socket

HOST = '127.0.0.1'
PORT = 8888

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))

server.listen(15)
print(f'Server HOST:PORT start.')

users = []

def send_all(data):
    for user in users:
        user.send(data)

def listen_user(user):
    print('Listening user')
    
    while True:
        data = user.recv(1024)
        print(f'User sent data')

        send_all(data)

def start_server():
    while True:
        user_socket, addr = server.accept()
        users.append(user_socket)

        potok_info = threading.Thread(target=listen_user, args=(user_socket,))
        potok_info.start()


if __name__ == '__main__':
    start_server()

客户:

import socket
import time
import threading
import os

HOST = '127.0.0.1'
PORT = 8888

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))


def send_message():
    print('Enter name: ')
    name = input()
    while True:
        data = client.recv(1024)
        print(data.decode('utf-8'))
        msg = (f'name send message data')
        client.send(msg.encode('utf-8')) # this
        
        
def send_server():
    
    listen_thread = threading.Thread(target=send_message)
    listen_thread.start()

    while True:
        client.send(input('you: ').encode('utf-8'))

        

if __name__ == '__main__':
    os.system('clear')
    print('***** Welcome in Security Chat. *****')
    send_server()

【问题讨论】:

服务器需要解码data 这能回答你的问题吗? How to send a message from client to server in python 【参考方案1】:

我这样修改了你的代码。

这是你的服务器脚本。

import threading
import socket

HOST = '127.0.0.1'
PORT = 8888

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))

server.listen(15)
print(f'Server HOST:PORT start.')

users = [] # To store their name
sort = [] # To store their socket

def listen_user(user):
    print('Listening user')
    sort.append(user)  # Store their socket in sort[]
    user.send('Name'.encode('utf-8')) # send 'Name' to clients
    name = user.recv(1024).decode('utf-8') # Receive their name
    users.append(name) # Store their name in user[]

    while True:
        data = user.recv(1024).decode('utf-8')
        print(f'name sent data')

        for i in sort: # Send received messages to clients
           if(i != server and i != user): # Filter server and message sender. Send message except them.
               i.sendall(f'name > data'.encode('utf-8'))
   
    user.close() # To close client socket connection.

def start_server():
    while True:
       user_socket, addr = server.accept()
       potok_info = threading.Thread(target=listen_user, args=(user_socket, ))
       potok_info.start()


if __name__ == '__main__':
    start_server()

这是你的客户端脚本,

import socket
import time
import threading
import os

HOST = '127.0.0.1'
PORT = 8888

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))

def send_message():

   if('Name' in client.recv(1024).decode('utf-8')): # If 'Name' received. It allows you to send the name.
       name  = input('Enter Name : ') # Type name
       client.send(name.encode('utf-8'))

   while True:
       data = input('Enter : ') # Enter message
       client.send(data.encode('utf-8'))
    
       receive = client.recv(1024).decode('utf-8')# Receive messages from other clients.
       print(receive)

def send_server():

   listen_thread = threading.Thread(target=send_message)
   listen_thread.start()      

if __name__ == '__main__':
   os.system('clear')
   print('***** Welcome in Security Chat. *****')
   send_server()

添加删除代码中的某些部分。仔细研究它,然后您就可以识别代码中的错误。

【讨论】:

非常感谢您更改代码,确实改进了。但是看看如何让服务器接收来自客户端的消息并将其显示在服务器上?需要的设置:用户在客户端输入一个名字,当向另一个客户端发送消息时,服务器会显示他的名字和他发送的信息。 你什么意思?,我想你也想在服务器端显示客户端名称和他们的消息。 我改变我的代码试试看。如果您想更改其他内容,请告诉我。 是的,我想在具有特定名称的服务器上并行显示消息,由谁执行。例如,我启动了一个服务器和两个客户端。我命名了第一个约翰,第二个杰西卡。 John向第二个客户端(Jessica)发送消息,发送成功后,Jessica收到John发来的消息,服务器收到消息和发送消息的客户端名称。 我认为我们需要通过 input() 获取变量“name”,并通过 client.send (name.encode ('utf-8)) 将此变量传递给服务器上的客户端,但是这个选项是不正确的,尽管逻辑很清楚。 - print (f 'name 发送以下消息:data'。

以上是关于如何从客户端套接字获取信息并在服务器上显示信息?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从使用 c++ 和 windows 连接到服务器的套接字获得啥信息?

android中怎么实现客户端输入一条查询信息通过数据库返回并在客户端显示

在服务器端护照js本地用户身份验证后,如何在客户端使用cookie显示用户信息?

如何从任意客户端查找 DHCP 租约信息?

如何使用 GET 或 POST 方法将对象详细信息传递给 index.html 并在 HTML <pre> 标记中显示

如何将我在表单上填写的信息从一个活动保存到另一个活动并在我的 Android 程序中显示多次尝试? [关闭]