【问题标题】:How to pass socket objects between two clients in any language C++, Python, Java, C如何使用任何语言 C++、Python、Java、C 在两个客户端之间传递套接字对象
【发布时间】: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 并将其传递。

【问题讨论】:

  • 你想两边都有相同的插座吗?为什么?您的处理程序是主机和端口。在每个连接(输入或输出)上,您都有新的套接字描述符。
  • 当您说“套接字对象”时,不清楚您的意思。你的意思是“一个代表套接字的对象”,还是一个代表其他东西的对象,你想使用套接字作为传输机制传输到另一个程序?
  • 代表套接字的对象

标签: python sockets


【解决方案1】:

Socket 对象不能被传输(或者你知道,传送 :D )到另一种语言或任何东西。最多,您可以创建一个协议,通过该协议可以将套接字的实例传输到另一种语言。但同样,我看不出它对你有什么帮助。

你有一个监听 2000 端口的服务器套接字。另一个 Java 套接字可以使用客户端套接字连接到它。那么,将一个套接字发送到另一个套接字有什么意义呢?通讯链接不知何故旋转起来。就像,我们可以吃自己来再生我们。但那是不可能的

同样,你最多可以将服务器套接字的一个实例发送到 java 套接字。但在同一台计算机上,Java 将无法重新创建它,因为该端口已被另一个程序监听。

接下来,如果两个程序可以监听同一个端口,那么窃取数据和伪造数据将变得非常容易。所以,两个程序不可能监听同一个端口。

我认为您正在寻找的是,两个程序共同处理同一个套接字的 I/O。至少这是合理的。

为此,您应该在这两个进程之间创建某种双向通信链接。就像不同端口上的另一个套接字一样。

就像 S 是服务器(套接字 S1 的唯一所有者),而 A 和 B 是处理程序。 S 应该监听两个不同的端口。其中只有 A 和 B 相连。然后,任何到达 S 的数据,由 S 自行决定是否适合 A 或 B,然后,A 或 B 将回复该请求。然后 S 会做出适当的回应。

另一种方法是 S 是 main 服务器套接字。 A 和 B 是侦听不同端口的服务器。每当数据到达 S 时,S 根据内容将其发送给 A 或 B。

第三,最混乱的解决方案是,A 是服务器,它通过某种通信(服务器-客户端或线程或子进程)将一些任务卸载到 B,并且它们适当地处理数据。 称其为混乱的原因是一个人必须处理两个任务并且更难维护其功能。

但是,共享一个套接字就像使用一个副本的同一个页面来完成两个不同的任务。希望对你有帮助

【讨论】:

  • 您好,我想知道如何在两个客户端之间传递套接字对象,以便两个客户端使用相同的套接字实例连接到服务器。这是否可以在 Java 或任何其他语言中将套接字对象传递给其他客户端并使用该信息其他客户端能够与服务器连接。
  • 一个对象属于一个程序。充其量您可以重用端口(如果启用了 SO_REUSEADDR),但不可能“共享”套接字。我可以把球拿在你手里。但是你能把手给我吗?它摇摇欲坠。两个不同的进程不能共享同一个套接字。但他们可能共享相同的信息
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多