【发布时间】:2015-09-20 18:31:21
【问题描述】:
我有一个想法,比如 client 和 server 之间的基本通信是如何建立的。所以序列化数据流可以在client和server之间传递。但我想知道,socket objects 是如何在两个 clients 之间传递的:我想知道是否可以 在两个客户端之间传递套接字对象并且两者共享同一个套接字实例。请提出建议。
Client class:
import socket
import sys
# create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#connect the socket to the port where server is listening
server_address = ('localhost',2000)
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)
#after connection is established, data can be through socket with sendall() and recv()
try:
#send data
message = 'This is Message. It will be repeated'
print >>sys.stderr, 'sending "%s"' % message
sock.sendall(message)
#llok for the response
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = sock.recv(16)
amount_received += len(data)
print amount_received
print >>sys.stderr, 'received "%s"' % data
finally:
print >>sys.stderr, 'closing socket'
sock.close()
Server 类创建用于接收来自 client 的消息并返回一些消息。
Server class:
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ("localhost",2000)
print >>sys.stderr, 'starting up on %s port %s' %server_address
sock.bind(server_address)
sock.listen(1)
while True:
print >>sys.stderr, 'waiting for connection'
connection, client_address = sock.accept()
try:
print >>sys.stderr, 'connection from', cleint_address
while True:
data = connection.recv(16)
print >>sys.stderr, 'received "%s"' % data
if data:
print >>sys.stderr, 'sending data back to the client'
connection.sendall(data)
else:
print >>sys.stderr, 'no more data from', client_address
break
finally:
connection.close()
server 启动后,client 与 server 连接并显示合适的消息。现在,我不想在 client 和 server 之间发送消息,而是想将 socket 对象 发送到另一个 client 这可以使用TCP 或UDP 来实现。在TCP 中,需要对数据进行序列化。我想知道有没有办法包装 socket object 并将其传递。
【问题讨论】:
-
你想两边都有相同的插座吗?为什么?您的处理程序是主机和端口。在每个连接(输入或输出)上,您都有新的套接字描述符。
-
当您说“套接字对象”时,不清楚您的意思。你的意思是“一个代表套接字的对象”,还是一个代表其他东西的对象,你想使用套接字作为传输机制传输到另一个程序?
-
代表套接字的对象