c# - 通过 gprs 从设备读取消息

标签 c# tcp gprs

我有一个 GPS 设备,将安装在许多卡车上。 我可以将设备配置为通过 gprs 向 IP 和端口发送数据语句“gps 数据,设备 id”。 我正在使用 TcpListener 类来读取服务器端的数据。

TcpListener server = null;
private void listen_data()
{
    Int32 port = controller_port;
    IPAddress localAddr = IPAddress.Parse(this_ip);
    server = new TcpListener(localAddr, port);
    server.Start();
    Byte[] bytes = new Byte[256];
    String data = null;
    while (true)
    {
        Console.Write("Waiting for a connection...-- ");
        TcpClient client = server.AcceptTcpClient();
        Console.Write("Connected!");
        data = null; int i;
        NetworkStream stream = client.GetStream();
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
        }
    }
}

该方法正在监听服务器 ip 和端口上的内容。

  1. 我想知道我是否将设备配置为发送到同一端口上的服务器。我是否能够收听所有设备或第一个连接的设备将是唯一的设备?

  2. 这种方法是从设备读取即将到来的数据的最佳方式吗?

  3. 我是否需要为每个设备配置不同的端口并为每个设备端口创建一个新的监听线程?

  4. 有时我会遇到异常“请求 channel 在等待回复时超时”

非常感谢您的帮助。

最佳答案

在您的代码中,您正在监听所有设备,但只有在完成从第一个设备读取所有数据之后,您才会收到“请求 channel 在等待回复时超时”。每个线程都应该处理不同的线程一个 tcpClient

所以代码应该是这样的:

TcpListener server = null;
private void listen_data()
{
    Int32 port = controller_port;
    IPAddress localAddr = IPAddress.Parse(this_ip);
    server = new TcpListener(localAddr, port);
    server.Start();
    while (true)
    {
        Console.Write("Waiting for a connection...-- ");
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("new client connected");
        ThreadPool.QueueUserWorkItem(new WaitCallback(HandleClient), client);//or use Task if 4.0 or new Thread...
    }
}

private void HandleClient(object tcpClient)
{
    TcpClient client = (TcpClient)tcpClient;
    Byte[] bytes = new Byte[256];
    String data = null;
    int i;

    NetworkStream stream = client.GetStream();
    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
    {
        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    }

    Console.WriteLine(data);
}

关于c# - 通过 gprs 从设备读取消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6649139/

相关文章:

c# - Windows Phone - 如何首次设置 LocalSettings?

c# - 如何使用 LINQ 返回 FileInfo.Name 的子字符串

ios - 使用 Swift 的 TCP 套接字

linux - 如何在 LAN Linux 中创建到另一台计算机的 tcp 重定向

java - "java.net.BindException: Address already in use"尝试使用与前一个线程相同的新线程创建套接字时

java - J2ME HttpConnection 无限重定向

vb.net - Meitrack设备返回什么来确认服务器收到的数据

C# 用 mysqllist 填充列表框

c# List<myObject> myList.copyTo() 保留引用?

gsm - 手机上的AT命令