创建一个聊天(客户端)程序。如何添加同步对话?

保罗·西格诺索(Paul Sigonoso)
# -*- coding: utf-8 -*-
#!/usr/bin/python3
import socket
# nao tem servidor UDP no google -> vamos usar netcat como servidor UDP!
#Programa de chat: so fala um de cada vez
#implementar falando ao mesmo tempo

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


"""
pacotes_recebidos = client.recvfrom(1024) devolve uma tupla:
(' llallalaaaa\n', ('192.168.1.4', 667))

msg recebida + (IP,porta)
"""
try:

    while 1: #while True
        client.sendto(input("Voce: ") +"\n", ("192.168.1.4", 668))  # endereço do servidor UDP do kali linux usando netcat
        msg, friend = client.recvfrom(1024)
        print(str(friend) + ": " + msg)
 #se quiser apenas o ip: use friend[0]
# convertemos str(friend) porque recebemos o erro:
# (TypeError(can only concatenate tuple (not str) to tuple,))

    client.close()


except Exception as erro:
    print("Conexao falhou ")
    print("O erro foi: ", erro)
    client.close()

在python 3.5(Linux)中,当我发送“ hi”时,此代码显示错误:

('O erro foi: ', NameError("name 'hi' is not defined",))

该代码在python 2.7上运行。

我想让两个人可以同时讲话,怎么办?目前,一次只能输入一个人的信息,我们必须等待其中一位参与者写信并点击继续才能有人可以帮助我吗?我使用netcat作为服务器。

桑德·卢西亚诺(Xander Luciano)

这是python3中“多线程” UDP python客户端的示例,该客户端允许同时发送和接收消息。

我个人喜欢为socket具有所有内置线程和函数创建一个包装器,因此我们将从包装器开始。

import socket
import threading

class socketwrapper:
    def __init__(self, host, port):
        self.server = (host, port)
        self.client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.client.settimeout(5) # Time is in seconds
        self.connected = False

    def startrecvdata(self):
        recvThread = threading.Thread(target=self.recvdata)
        recvThread.daemon = True
        recvThread.start()
        self.connected = True

    def recvdata(self):
        while self.connected:
            try:
                data, friend = self.client.recvfrom(1024)
                if data:
                    print(str(friend) + ": " + data.decode('utf-8'))
            except socket.timeout:
                else:
                    print("No Message Received before timeout.")
                    continue
            except:
                self.connected = False
        self.stop()

    def sendmessage(self, data):
        data += "\n"
        self.client.sendto(data.encode('utf-8'), self.server)

    def stop(self):
        self.client.shutdown(socket.SHUT_RDWR)
        self.client.close()

如您所见,我们在其中有两个函数,您应该注意的两个是startrecvdata(self)recvdata(self)我们将从startrecvdata(self)主函数调用,这将启动recvdata(self)线程。该功能会将所有接收到的数据打印到控制台。

另外,请注意,我们具有包装器settimeout(5)__init__功能,功能在套接字连接上设置5秒超时。这样,我们可以干净地关闭整个程序,使用该stop()函数关闭和关闭套接字

现在进入主循环。由于我们在wrapper类中设置了所有函数,因此我们可以拥有一个超级简单和干净的循环:

def main():
    server = socketwrapper('192.168.1.1', 30000)
    server.startrecvdata()

    while not server.connected:
        continue

    print("Connected to server! Type 'exit' to quit.")

    while server.connected:
        message = input("Voce: ")
        if message == "exit":
            server.connected = False
            break

        server.sendmessage(message)

    server.stop()

在此循环中,我们创建了我们的实例,该实例为我们socketwrapper初始化了所有内容。然后我们调用server.startrecvdata()它,如上所述,启动函数以从UDP连接接收和打印数据。while not server.connected块的程序,直到线程已经开始。

最后,我们有一个while server.connected循环,它等待控制台中的用户输入。我们检查用户是否要退出,如果要退出,则设置server.connected = Falsebreakwhile循环。
如果用户不想退出,我们会将消息发送到UDP服务器。

循环结束后,我们调用server.stop以确保在退出应用程序之前关闭套接字。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用python socketserver.TCPServer做一个多客户端聊天室

来自分类Dev

创建一个Skype Web客户端

来自分类Dev

我想要一个与 watsapp 或 SMS Messenger 同步并自动响应用户/客户端的 android 应用程序

来自分类Dev

如何在GO中使用CA证书创建一个tls客户端?

来自分类Dev

如何在python中创建一个持续运行的套接字客户端

来自分类Dev

我正在创建一个扑克客户端,如何使异常处理更加简洁?

来自分类Dev

客户端如何了解另一个客户端是否已连接

来自分类Dev

尝试制作一个简单的客户端聊天框;给我一个 cout 问题

来自分类Dev

如何在Windows WPF应用程序离线中的一个笔记本机客户端中创建页面?

来自分类Dev

如何创建一个Android聊天应用程序

来自分类Dev

允许一个房间中的两个客户端进行视频聊天(webRTC)

来自分类Dev

允许一个房间中的两个客户端进行视频聊天(webRTC)

来自分类Dev

如何从另一个客户端或服务器向列表中添加文本?

来自分类Dev

如何从另一个客户端或服务器将文本添加到列表中?

来自分类Dev

多客户端聊天程序,向所有客户端广播聊天?

来自分类Dev

创建一个独立的Java Websocket客户端端点?

来自分类Dev

在C中使用Modbus创建一个简单的客户端/服务器

来自分类Dev

为RabbitMQ客户端连接创建一个类

来自分类Dev

创建一个 JSON 对象以发送回客户端

来自分类Dev

在 amqp rpc 客户端中创建一个 spring 会话

来自分类Dev

一个简单的客户端服务器套接字程序的PrintWriter和OutputStream

来自分类Dev

一个简单的使用python的socket服务器和客户端程序

来自分类Dev

是否可以通过另一个 Java 程序控制 Spotify 客户端?

来自分类Dev

Fabric.js-将object:modified事件同步到另一个客户端

来自分类Dev

Fabric.js-将object:modified事件同步到另一个客户端

来自分类Dev

如何通过SignalR从一个客户端向另一个客户端发送javascript对象

来自分类Dev

NFS:与除一个客户端外的所有客户端共享

来自分类Dev

如何将Google Talk(〜环聊)添加到Pidgin聊天客户端?

来自分类Dev

从另一个客户端控制Spotify

Related 相关文章

  1. 1

    如何用python socketserver.TCPServer做一个多客户端聊天室

  2. 2

    创建一个Skype Web客户端

  3. 3

    我想要一个与 watsapp 或 SMS Messenger 同步并自动响应用户/客户端的 android 应用程序

  4. 4

    如何在GO中使用CA证书创建一个tls客户端?

  5. 5

    如何在python中创建一个持续运行的套接字客户端

  6. 6

    我正在创建一个扑克客户端,如何使异常处理更加简洁?

  7. 7

    客户端如何了解另一个客户端是否已连接

  8. 8

    尝试制作一个简单的客户端聊天框;给我一个 cout 问题

  9. 9

    如何在Windows WPF应用程序离线中的一个笔记本机客户端中创建页面?

  10. 10

    如何创建一个Android聊天应用程序

  11. 11

    允许一个房间中的两个客户端进行视频聊天(webRTC)

  12. 12

    允许一个房间中的两个客户端进行视频聊天(webRTC)

  13. 13

    如何从另一个客户端或服务器向列表中添加文本?

  14. 14

    如何从另一个客户端或服务器将文本添加到列表中?

  15. 15

    多客户端聊天程序,向所有客户端广播聊天?

  16. 16

    创建一个独立的Java Websocket客户端端点?

  17. 17

    在C中使用Modbus创建一个简单的客户端/服务器

  18. 18

    为RabbitMQ客户端连接创建一个类

  19. 19

    创建一个 JSON 对象以发送回客户端

  20. 20

    在 amqp rpc 客户端中创建一个 spring 会话

  21. 21

    一个简单的客户端服务器套接字程序的PrintWriter和OutputStream

  22. 22

    一个简单的使用python的socket服务器和客户端程序

  23. 23

    是否可以通过另一个 Java 程序控制 Spotify 客户端?

  24. 24

    Fabric.js-将object:modified事件同步到另一个客户端

  25. 25

    Fabric.js-将object:modified事件同步到另一个客户端

  26. 26

    如何通过SignalR从一个客户端向另一个客户端发送javascript对象

  27. 27

    NFS:与除一个客户端外的所有客户端共享

  28. 28

    如何将Google Talk(〜环聊)添加到Pidgin聊天客户端?

  29. 29

    从另一个客户端控制Spotify

热门标签

归档