Python:套接字编程:accept()和连接调用

时间:2013-08-27 21:56:02

标签: python sockets tcp

我几个月以来一直在自学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]'

1 个答案:

答案 0 :(得分:1)

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

这样想:

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

来自accept上的文档:

  

socket.accept()

     

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