MAUI C# TCP Server在Android运行失败的问题及解决办法
MAUI TCP Server在Android端启动报错:System.Net.Sockets.SocketException: Permission denied
问题说明
使用MAUI将TCP Server迁移至Android设备,该服务在Windows系统可正常运行,但在Android端执行serverSocket.Start()时触发System.Net.Sockets.SocketException: 'Permission denied'异常。
相关代码
using System.Net.Sockets; using System.Net; using System.Text; namespace terminal_only; public partial class MainPage : ContentPage { int count = 0; string read; TcpClient client; NetworkStream ns; TcpListener serverSocket; bool connstat; public MainPage() { InitializeComponent(); startthread(); } private void startthread() { Thread svrThread = new Thread(new ThreadStart(receiver)); svrThread.IsBackground = true; svrThread.Start(); connstat = true; } private void receiver() { serverSocket = new TcpListener(IPAddress.Any, 85);// Convert.ToInt32(textBox1.Text)); serverSocket.Start(); while (true) { client = serverSocket.AcceptTcpClient(); ns = client.GetStream(); while (client.Connected && connstat) { try { byte[] readmsg = new byte[100]; ns.Read(readmsg, 0, readmsg.Length); read = Encoding.ASCII.GetString(readmsg); // textBox2.Invoke(new MethodInvoker(delegate () { textBox2.Text = textBox2.Text + "\r\n" + read; })); byte[] msg = System.Text.Encoding.ASCII.GetBytes("gotit"); ns.Write(msg, 0, msg.Length); /* if (client.Client.Poll(0, SelectMode.SelectRead)) { byte[] buff = new byte[1]; if (client.Client.Receive(buff, SocketFlags.Peek) == 0) { connstat = false; } } }*/ // textBox2.Invoke(new MethodInvoker(delegate () { textBox2.Text = textBox2.Text + "\r\nDisconnected"; })); if (!connstat) break; } catch { } } } serverSocket.Stop(); startthread(); } }
Android清单权限配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true"></application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-sdk android:minSdkVersion="21" /> </manifest>
错误情况
执行serverSocket.Start()时抛出异常:System.Net.Sockets.SocketException: 'Permission denied'
解决方案
将监听端口修改为1024以上的端口(例如3333),问题即可解决。
内容的提问来源于stack exchange,提问作者Amos Rohe
相关产品推荐
相关产品推荐

