我有一个套接字,我正在尝试从客户端向服务器发送信息。两者都位于同一网络上,具有不同的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);
首先,我不确定要放什么TcpListener
IP。显然我的错误是因为它引发SocketException
:The requested address is not valid in its context
。
编辑:
第一个问题已解决,我使用模拟器运行并将10.0.2.2
用于连接IP。现在,C#抛出异常。这是周围的代码:
删除完整代码以防止泄露
在以while
开头的行上,我得到一个ObjectDisposedException
,表示NetworkStream已被释放。有什么帮助吗?
答案 0 :(得分:1)
如果您使用的是Android模拟器,则需要注意IP地址。
引用Matthias从另一个与此相关的Stack Overflow答案的答案(在此处找到:How to get the Android Emulator's IP address?)
在您的应用中,您可以简单地将模拟器称为 'localhost'或127.0.0.1。
网络流量通过您的开发机器进行路由,因此 模拟器的外部IP是指分配给它的IP 机器由您的提供商。开发机器总是可以的 从你的设备到达10.0.2.2。
假设开发机器正在运行您的服务器,如果您更改代码以使用10.0.2.2 IP地址,您的问题很可能会得到解决。
答案 1 :(得分:1)
您不应该为TCP Listener
添加IP地址。客户端用于连接的IP地址只是计算机的IP地址。只有客户端应为Socket
应连接的位置添加IP地址。
编辑:我的意思是你应该为TCPListener
使用“127.0.0.1”因为它指向自己。然后使用AcceptTcpClient
方法接受客户端。
找到一个示例http://theanti9.wordpress.com/2008/02/13/c-tcplistener-example/
另一个编辑:抱歉,听众IP地址可能是IPAddress.Any
?我的C#对于它的期望是生锈的,但它应该是其中之一。
另一个编辑:查看最新的代码编辑后,您在监听循环中调用client.Close()
。这导致客户端关闭Socket
连接,从而使您创建的Stream
对象无效。这就是它给你ObjectDisposed
错误的原因,因为Stream不再存在了。