gpt4 book ai didi

c# - C# TcpListener 和 Java ServerSocket 的区别

转载 作者:行者123 更新时间:2023-11-30 02:54:47 25 4
gpt4 key购买 nike

我正在研究 PC 和 Android 设备之间的文件传输程序。但我发现 PC 服务器部分有问题。

首先,我的 android 应用请求连接到 PC,如下所示。

public void run() {
try {
InetAddress lServerAddress = InetAddress.getByAddress(
new byte[] { (byte)192, (byte)168, (byte)0, (byte)196 });
Socket lClient = new Socket();
lClient.bind(null);
lClient.connect(new InetSocketAddress(lServerAddress, 12303), 20000);
OutputStream lOutput = lClient.getOutputStream();
lOutput.write(ByteBuffer.allocate(4).putInt(123456).array());
} catch (Exception e) {
Log.e(AppManager.msLogTag, e.getMessage());
}
}

这段代码在工作线程中执行。

然后是 Java 中的服务器代码。

public static void main(String[] args) {
try {
ServerSocket lServer = new ServerSocket(12303);
Socket lClient = lServer.accept();
System.out.println("Accepted.");
InputStream lReadStream = lClient.getInputStream();
byte[] lBuffer = new byte[4];
lReadStream.read(lBuffer, 0, lBuffer.length);
ByteBuffer lBytes = ByteBuffer.wrap(lBuffer);
System.out.println(lBytes.getInt());
lReadStream.close();
lClient.close();
lServer.close();
} catch (Exception e) {
e.printStackTrace();
}
}

它工作得很好。

但是在 C# 中,TcpListener 不会永远接受客户端。这是来源。

static void Main(string[] args)
{
IPAddress lServerIp = null;
foreach (IPAddress lIp in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (lIp.AddressFamily == AddressFamily.InterNetwork)
{
lServerIp = lIp;
break;
}
}
if (lServerIp != null)
{
TcpListener lServer = new TcpListener(lServerIp, 12303);
Console.WriteLine(lServerIp.ToString());
lServer.Start();
using (Socket lClient = lServer.AcceptSocket())
{
Console.WriteLine(((IPEndPoint)lClient.RemoteEndPoint).Address.ToString());
using (Stream lStream = new NetworkStream(lClient))
{
byte[] lBuffer = new byte[4];
lStream.Read(lBuffer, 0, lBuffer.Length);
int lHead = BitConverter.ToInt32(lBuffer, 0);
Console.WriteLine(lHead.ToString());
}
}
}
}

环境相同,端口转发和注册防火墙异常(exception)。所以我认为,Java 的 ServerSocket 和 C# 的 TcpListener 的工作方式不同。然而,TCPProtocol 有世界标准,顺便说一句,他们怎么能以不同的方式工作呢?我无法理解这种情况。

最后,我该如何修复 C# 服务器?

谢谢。

最佳答案

两种语言的工作方式应该相同,而且我在您的代码中看不到任何明显的错误。但是,尚不清楚您在所有示例中使用的 IP 地址:

a) 您的 java 示例未指定要绑定(bind)的 IP 地址(我假设默认情况下它将绑定(bind)到 0.0.0.0,即所有本地 IP 地址,但您可以使用 netstat 进行检查)。

b) C# 代码将只绑定(bind)到它找到的第一个 IP 地址。这可能类似于 127.0.0.1。

为了确定,只需更改两个代码 fragment 以显式绑定(bind)到预期的 IP 地址 (192.168.0.196),然后重试。

关于c# - C# TcpListener 和 Java ServerSocket 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23464570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com