1

我有一个套接字,我正在尝试将信息从客户端发送到服务器。两者都位于同一网络上,具有不同的 LAN IP(如下):

我的服务器是我的 C# 应用程序。- 192.168.0.2 我的客户端是我的 Android 应用程序。- 192.168.0.7

这是我TcpListener的服务器:

server = new TcpListener(IPAddress.Parse("192.168.0.7"), 7079);

这是我在客户端上的连接:

Socket conn = new Socket("192.168.0.2", 7079);

首先,我不确定将什么作为TcpListenerIP。显然我所拥有的是错误的,因为它抛出一个SocketException: The requested address is not valid in its context

编辑:

第一个问题解决了,我使用模拟器运行并10.0.2.2输入连接IP。现在,C# 正在抛出异常。这是周围的代码:

删除完整代码以防止泄露

在以 开头的行中while,我得到一个ObjectDisposedException说法,即 NetworkStream 已被处置。有什么帮助吗?

4

2 回答 2

1

您不应该为TCP Listener. 客户端用来连接的 IP 地址就是计算机的 IP 地址。只有客户端应该为Socket应该连接的位置添加一个 IP 地址。

编辑:我的意思是你应该使用“127.0.0.1”,TCPListener因为它指向它自己。然后您使用该AcceptTcpClient方法接受客户。

为您找到了一个示例http://theanti9.wordpress.com/2008/02/13/c-tcplistener-example/

另一个编辑:对不起,也许是IPAddress.Any监听器 IP 地址?我的 C# 对于它的预期已经生锈了,但它应该是这两者之一。

另一个编辑:查看您最新的代码编辑后,您正在调用client.Close()您的监听循环。这会导致客户端关闭Socket连接,从而使Stream您创建的对象无效。这就是它给你ObjectDisposed错误的原因,因为 Stream 不再存在。

于 2012-07-20T19:43:42.907 回答
1

如果您使用的是 Android 模拟器,则需要注意 IP 地址。

从与此相关的另一个 Stack Overflow 答案中引用 Matthias 的答案(可在此处找到:How to get the Android Emulator's IP address?

在您的应用程序中,您可以简单地将模拟器称为“localhost”或 127.0.0.1。

Web 流量通过您的开发机器路由,因此模拟器的外部 IP 是您的提供商分配给该机器的任何 IP。开发机器始终可以从您的设备访问 10.0.2.2。

假设开发机器正在运行您的服务器,如果您将代码更改为使用 10.0.2.2 IP 地址,您的问题很可能会得到解决。

于 2012-07-20T19:20:26.697 回答