1

几个月以来我一直在自学python,终于学会了Socket编程。作为一个教科书练习,我应该设计一个半双工聊天系统。下面是代码。第一个请求和响应都很好,但是每次我尝试从客户端发送第二条消息时,服务器似乎都挂了。该程序基于 TCP。

我怀疑由于每次必须发送新消息时都会调用 ss.accept() ,因此正在创建一个新线程,但是由于我只从客户端调用了一次 sc.connect() ,因此可能是我的新连接在服务器端挂在那里无限时间。

作为一个线索:我在while循环之外调用了ss.accept(),即只建立1个连接并在while循环上一遍又一遍地收听数据,对话工作得很好

有人可以看看代码并帮助我了解问题到底出在哪里。

因为,我正在学习,我还没有转向扭曲。在转向框架之前,我想先学习所有基础知识。

     !bin/usr/env python

import socket, sys
HOST =''
PORT = 1060
ADDR =(HOST,PORT)

def userinput(sock):
    usermessage = input('>')
    sock.sendall(str(len(usermessage)))
    return usermessage


def server():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.bind(ADDR)
    s.listen(1)
    print 'the server is listening at',s.getsockname()

    while True:
        ss,sockname = s.accept()    
    #listen to determine the bytes sent by client
        msglen = ss.recv(4096)
    #accept the complete message
        msg = ss.recv(int(msglen))
        print 'client:', repr(msg)
        servermsg = userinput(ss)
        ss.sendall(servermsg)
        print " ---------------"
    ss.close()

def client():
    sc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sc.connect(ADDR)    
    while True:
        message = userinput(sc)
        sc.sendall(message)
        replylen = sc.recv(4096)
        reply = sc.recv(int(replylen))
        print "reply:",reply

        print "----------------"
    sc.close()

if sys.argv[1:] == ['server']:
    server()

elif sys.argv[1:] == ['client']:
    client()
else:
    print >> sys.stderr,'usage:tcp_2_7.py server|client[host]'
4

1 回答 1

1

您的试用 - 接受一次然后接收多条消息 - 是您应该这样做的方式。呼叫accept正在等待新的连接 - 您无需在每次想要发送或接收消息时都这样做,就像您不想在connect每次想要发送或接收时都呼叫一样。

这样想:

当您连接到聊天服务器时,您会立即连接、发送消息,然后立即断开连接吗?否 - 您有一个持续打开的连接,通过该连接发送消息,并且该连接仅在聊天会话结束时关闭。

从上的文档accept

socket.accept()

接受连接。套接字必须绑定到一个地址并监听连接。返回值是一对 (conn, address),其中 conn 是一个新的套接字对象,可用于在连接上发送和接收数据,地址是绑定到连接另一端套接字的地址。

于 2013-08-27T22:37:02.730 回答