Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python测试环回套接字连接?_Python_Sockets - Fatal编程技术网

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

如何使用python测试环回套接字连接?,python,sockets,Python,Sockets,我想测试一个复杂的类,它封装了socket模块的一些方法:connect、sendall和recv。特别是,我想测试这个类的recv方法 下面的工作示例代码显示了我如何做到这一点(以基本的底层形式保持简单,testsocket将对应于复杂的包装类): 导入套接字 #这只是一个用于测试的套接字,绑定到环回设备 sock=socket.socket(socket.AF\u INET,socket.sock\u流) 袜子装订((“127.0.0.1”,1234)) 短袜,听(5) #这是复杂套接字包装

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

下面的工作示例代码显示了我如何做到这一点(以基本的底层形式保持简单,
testsocket
将对应于复杂的包装类):

导入套接字
#这只是一个用于测试的套接字,绑定到环回设备
sock=socket.socket(socket.AF\u INET,socket.sock\u流)
袜子装订((“127.0.0.1”,1234))
短袜,听(5)
#这是复杂套接字包装的套接字后期部分。
#它只包含对connect、sendall和recv的调用
testsocket=socket.socket(socket.AF\u INET,socket.SOCK\u流)
testsocket.connect((“127.0.0.1”,1234))
testsocket.sendall(“test_send”)
#测试套接字连接到客户端
(客户,美国存托凭证)=库存接受()
打印client.recv(1024)
#现在我可以做实际的测试:测试套接字的接收方法
#包装在复杂类中
client.sendall(“测试记录”)
打印testsocket.recv(1024)#使用如何

注意仅在Unix中可用


使用


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

我的日常工作:

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()

你的问题不清楚。首先,您报告的代码没有错误,如图所示。第二,你没有举例说明你所说的“测试记录”是什么意思。代码有点奇怪,我希望使用fork或thread以单独的流程运行客户机和服务器。我已经更新了这个问题。代码可以工作,但我不知道是否可以用更短的代码来完成,只要保持简单就行了。也没有叉子和线。好的,我完全重新措辞了这个问题。我希望现在更清楚。我想这是一个可以接受的答案。我只需要将类的
\u socket
属性替换为
testsocket
,然后就可以运行测试了。谢谢
import socket

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

testsocket = mock.Mock()
testsocket.configure_mock(**{'recv.return_value': 'test_recv'})
print testsocket.recv(1024)
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()