进行套接字聊天时出错

时间:2017-01-08 05:20:32

标签: python sockets chat

我正在使用python中的套接字库进行聊天,它只能用一半的方式工作,当你将netcat用作我正在使用的频道时,我能够发送消息而另一个终端能够接收它们,但是,当该终端发送消息(键入文本,然后按回车)时,我不会通过python脚本收到它。所以我用以下方式运行它: python shell:

import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(("127.0.0.1",8000)
sock.listen(2)
(client, (ip,port))=sock.accept()

终端:

nc 127.0.0.1 8000

这工作并在python shell中发送或接收我所要做的就是输入:sock.send(" message")或sock.recv(2012) 这是我的代码:

#!/bin/python
import socket
import subprocess
from subprocess import Popen, PIPE
import time
class color:
    r = '\033[31m'
    g = '\033[32m'
    d = '\033[0m'
    b = '\033[94m'
    p = '\033[35m'

def clear():
    print('\n' * 100)

chat_clients = []

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clear()

def chatting_on_serverr():
        (client, (ip, port))=sock.accept()
    def chatting_on_server():
        message = raw_input("Send Message: ")
        client.send(message + '\n')
        client.recv(2012)
        chatting_on_server()
    chatting_on_server()

def make_channel():
    print color.b + '[+] '+color.d+'Welcome to the chat server'+color.b+' [+]'
    host = raw_input("Channel Name: ")
    port = input("Channel Access Key: ")
    clear()
    print color.p + "[info] "+color.b+"Making %s" % host
    time.sleep(1)
    sock.bind((host,port))
    sock.listen(3)
    print color.g + "[+] "+color.d+"Channel Made"+color.g+" [+]"+color.d
    print("[info]: Waiting for people to join your channel...")
    global chatting_on_serverr
    global chatting_on_server
    chatting_on_serverr()

clear()
make_channel()

2 个答案:

答案 0 :(得分:0)

由于网络限制,我无法在我的机器上重现这一点,但我建议您查看Python聊天客户端和服务器的tutorial。它将解释很多关于套接字和网络的知识。

除此之外,您不应该定义与代码中的函数同名的全局变量。它可能会覆盖他们的声明。另一件事是函数内部的函数。你可以像这样编写那个函数:

def chatting_on_server():
    client, (ip, port) = sock.accept()
    while True:
        message = raw_input("Send Message: ")
        client.send(message + '\n')
        client.recv(2012)

您将获得相同的功能。此外,由于chatting_on_server永远会自行调用,因此您可能会面临堆栈溢出错误。

祝你好运!

答案 1 :(得分:0)

所有需要做的就是打印.recv函数的输出     x = client.recv(2020)     打印(x)的