首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用python测试回环套接字连接?

如何用python测试回环套接字连接?
EN

Stack Overflow用户
提问于 2013-10-21 06:37:56
回答 2查看 4K关注 0票数 0

我想测试一个复杂的类,它封装了socket模块的一些方法:connectsendallrecv。特别是,我想测试这个类的recv方法。

下面的工作示例代码展示了我如何做到这一点(为了保持简单,testsocket将对应于复杂的包装类):

代码语言:javascript
复制
import socket

# This is just a socket for testing purposes, binds to the loopback device
sock =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 1234))
sock.listen(5)

# This is the socket later part of the complex socket wrapper.
# It just contains calls to connect, sendall and recv
testsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
testsocket.connect(("127.0.0.1", 1234))
testsocket.sendall("test_send")

# The testing socket connects to a client
(client, adr) = sock.accept()
print client.recv(1024)

# Now I can do the actual test: Test the receive method of the socket
# wrapped in the complex class
client.sendall("test_recv")
print testsocket.recv(1024)  # <--  This is what I want to test !!

# close everything
testsocket.close()
client.close()
sock.close()

但是为了测试testsocket.recv,我需要以前使用testsocket.sendall

是否可以以一种简单的方式(没有分叉或线程)修改这段代码,以便在不使用方法testsocket.recv的情况下测试testsocket.sendall

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-21 07:41:29

使用socket.socketpair怎么样?:

代码语言:javascript
复制
import socket

client, testsocket = socket.socketpair()
client.sendall("test_recv")
print testsocket.recv(1024)
testsocket.close()
client.close()

注意:仅在Unix中可用。

使用mock

代码语言:javascript
复制
import mock

testsocket = mock.Mock()
testsocket.configure_mock(**{'recv.return_value': 'test_recv'})
print testsocket.recv(1024)
票数 1
EN

Stack Overflow用户

发布于 2013-10-21 07:58:23

您不能在同一个进程/线程中运行客户端和服务器套接字,因为server.recv()是一个阻塞调用

我的日常生活:

代码语言:javascript
复制
import socket, threading

# Protocols supported
TCP = (0x00)
UDP = (0x01)
UDP_Multicast = (0x02)

# Client/ Server mode
CLIENT = (0x00)
SERVER = (0x01)

# Data to be sent
data = 'Test. Please Ignore'


# Server processing
def simple_processing(data):
    print "messsage : ", data


def start_socket( protocol, client, processing_callback):

    # switch on protocol
    if protocol == TCP:
        sock =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    else: 
        return

    # switch on client
    if client == SERVER:

        # Server mode = listening to incoming datas
        sock.bind(("127.0.0.1", 1234))
        sock.listen(5)
        (sock, adr) = sock.accept()
        processing_callback( sock.recv(1024) ) # processing data

    elif client == CLIENT:

        # Client mode : connecting and sending data
        sock.connect(("127.0.0.1", 1234))
        sock.sendall(data)


    else:
        return

    sock.close()


def test():

    # Thread creations
    server = threading.Thread( target = start_socket,
                               args=(   TCP,
                                        SERVER,
                                        simple_processing, )  
                              )

    client = threading.Thread(  target= start_socket, 
                                args=(  TCP,
                                        CLIENT,
                                        None)
                                )

    server.start()
    client.start()


    # Join : wait on every thread to finish
    client.join()
    server.join()

if __name__ == '__main__':
    # Launch the test
    test()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19487719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档