我需要将带有内置wifi卡的Android设备的Xamarin表格pcl或者两者都连接到tcp客户端。 事实是连接已经完成,写作也是如此,但我无法读取返回给我的数据。 我通常使用serial,我不希望它是因为我无法通过tcp读取的超时。
任何人都可以给我一些建议,我的意思是很少。 我正在使用这个插件Xamarin表单pcl来连接。
如果有人有任何其他解决方案,请告诉我。我想直接使用Socket,但我无法进入visual studio中的Systems.Net.Socket库。
private async void testTCPSocketPlugin()
{
int port = 5555;
String ip = "192.168.222.1";
TcpSocketListener listener = new TcpSocketListener();
await listener.StartListeningAsync(5555);
listener.ConnectionReceived += Listener_ConnectionReceived;
try
{
await client.ConnectAsync(ip, port);
//listener.ConnectionReceived += async (sender, args) =>
//{
// var clientListener = args.SocketClient;
// var bytesRead = -1;
// var buf = new byte[1];
// while (bytesRead != 0)
// {
// bytesRead = await args.SocketClient.ReadStream.ReadAsync(buf, 0, 1);
// if (bytesRead > 0)
// {
// }
// //Debug.Write(buf[0]);
// }
//};
}
catch (Exception ex)
{
throw ex;
}
//byte[] array1 = null;
Byte[] dati = new Byte[8];
dati[0] = 1;
dati[1] = 8;
dati[2] = 0;
dati[3] = 0;
dati[4] = 0;
dati[5] = 0;
dati[6] = 0xe0;
dati[7] = 0x0b;
Byte[] fromBoard = new Byte[8];
try
{
await client.WriteStream.WriteAsync(dati, 0, 8);
client.ReadStream.ReadTimeout = 5000;
Stream str = client.ReadStream;
int testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8);
}
catch (Exception ex)
{
throw ex;
}
}
private void Listener_ConnectionReceived(object sender, Sockets.Plugin.Abstractions.TcpSocketListenerConnectEventArgs e)
{
String test = "break here";
}
答案 0 :(得分:1)
好的,你的代码中有一些错误的东西,我会尝试指出所有这些。
首先,你将客户端和服务器代码混合在一个函数中,这非常令人困惑,即使这只是一个测试,所以首先将代码分成两个函数,它将更具可读性。 / p>
其次,您的客户端在服务器监听之前尝试连接和写入:
try
{
await client.ConnectAsync(ip, port);
}
catch (Exception ex)
{
throw ex;
}
//...
await client.WriteStream.WriteAsync(dati, 0, 8);
await listener.StartListeningAsync(5555);
这将使连接失败,在启动客户端之前服务器必须正在侦听。你声明连接已经建立,但我怀疑它,除非你执行两次调用,如果前一个服务器仍然在监听,第二次它将工作。
接下来,在挂钩事件之前调用await listener.StartListeningAsync(5555);
,这不是非常有害,但如果由于某种原因客户端在服务器启动时尝试连接,那么可能该连接将丢失,因为它会在没有附加到事件处理程序之前接受。
之后,您尝试从客户端流中读取,但服务器没有发送任何内容,因此代码将在int testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8);
处阻塞,直到它抛出读取异常,因为它将达到超时。
最后,如果您更喜欢纯本机解决方案,您可以在共享库上创建客户端/服务器代码,在iOS / Android项目上引用该库,在这些项目上创建DependencyService,然后在PCL库上检索服务这样你就可以完全控制代码。
更新:
似乎你根本没有使用任何服务器功能,试试这个:
async void Call()
{
TcpSocketClient client = new TcpSocketClient();
await client.ConnectAsync("192.168.222.1", 5555);
byte[] Data = new byte[] { 0x01, 0x08, 0, 0, 0, 0, 0xe0, 0x0b }
await client.WriteStream.WriteAsync(Data, 0, 8);
byte[] finalData = new byte[8];
int read = await client.ReadStream.ReadAsync(finalData, 0, 8);
//Check here, read will have the number of bytes read.
}
不要添加任何try / catch,如果抛出任何异常,请更新问题。