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

标签 python sockets tcp

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

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

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

谁能看看代码并帮助我了解问题的确切位置。

自从开始学习,还没有动到twisted呢。在转向框架之前,我想先学习所有基础知识。

     !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]'

最佳答案

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

这样想:

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

来自 accept 上的文档:

socket.accept()

Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.

关于Python:套接字编程:accept() 和 connect 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18476146/

相关文章:

C++ select 函数过早中断

python - 使用 Flask-SocketIO 自定义握手数据

networking - 如何在 Kubernetes 中公开非 HTTP、TCP 服务?

java - TCP JSON 命令未到达

python - 在python中导入全局命名空间

python - 如何使用 smtp 发送 html 电子邮件内嵌的 plot.ly 图像?

java - python解释器到底是用什么实现的?

python - 在 Python 中使用 pyqtgraph 进行多次更新图

客户端服务器套接字编程

mysql - 如何使用 go-sql-driver 通过 SSH 上的标准 TCP/IP 连接到 MySQL?