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

use*_*922 11 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()
Run Code Online (Sandbox Code Playgroud)

因此,如果另一个客户端发送消息,该客户端也将仅在发送消息后接收它.我打赌你了解我.我搜索了这个问题,发现了很多有趣的东西,比如异步I/O,线程,非阻塞同步,并发编程等等.我也安装了扭曲的包装.简而言之,我一直在学习所有这些东西但却找不到我想要的东西.(当然,我会一直努力尝试,直到我说到这一点.)

所以,我的问题是如何制作的?=)

Unk*_*own 8

你的问题不是很一致.但是,您的程序根本不需要异步即可实现您的要求.

这是一个您最初想要的工作聊天脚本,只需要很少的更改.它使用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()
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 5

如果你想从头开始编写代码就行select了(你可以在谷歌图书搜索中阅读包含这些内容的果壳中的大部分Python章节); 如果你想利用更多抽象,asyncore可用,但Twisted更丰富,更强大.