如何在Python中进行简单的命令行聊天?

2024-05-21 02:48:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我学习网络编程,想用Python编写一个简单的命令行聊天。

我想知道如何使接收常数和输入一起可随时发送。

如您所见,此客户端一次只能执行一项工作:

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while 1:
    data = raw_input('> ')
    if not data: break
    tcpCliSock.send(data)
    data = tcpCliSock.recv(BUFSIZE)
    if not data: break
    print data

tcpCliSock.close()

因此,如果另一个客户机发送了一条消息,那么这个客户机也只能在发送了一条消息之后才能接收到它。我打赌你理解我。我在google上找到了很多有趣的东西,比如异步I/O、线程、非阻塞同步、并发编程等等。我还安装了扭曲包。总之,我一直在学习这些东西,但还没有找到我要找的东西。(当然,我会一直努力,直到我说到点子上。)

所以,我的问题是怎么做到的?=)


Tags: 命令行网络host消息data客户机ifport
3条回答

聊天程序同时做两件事。

  1. 观看本地用户的键盘并发送给远程用户(通过某种插座)

  2. 监视远程套接字并在本地控制台上显示它们键入的内容。

你有几种方法可以做到这一点。

  1. 一种打开套接字和键盘并使用select模块来查看哪个已准备好输入的程序。

  2. 创建两个线程的程序。一个线程读取远程套接字并打印。另一个线程读取键盘并发送到远程套接字。

  3. 分叉两个子进程的程序。一个子进程读取远程套接字并打印。另一个子进程读取键盘并发送到远程套接字。

你的问题不太连贯。然而,您的程序根本不需要异步来实现您的要求。

这是一个工作的聊天脚本,你最初想要的变化很小。它使用1个线程接收和1个线程发送,都使用阻塞套接字。它比使用异步方法简单得多。

from socket import *
from threading import Thread
import sys

HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

def recv():
    while True:
        data = tcpCliSock.recv(BUFSIZE)
        if not data: sys.exit(0)
        print data

Thread(target=recv).start()
while True:
    data = raw_input('> ')
    if not data: break
    tcpCliSock.send(data)

tcpCliSock.close()

如果你想从头开始编写代码,select是一条路(你可以在Google图书搜索上阅读Python的大部分章节,简而言之,它涵盖了这些问题);如果你想利用更多的抽象,asyncore是可用的,但是Twisted更加丰富和强大。

相关问题 更多 >