1

最近我的任务是在 Nexus 7 平板电脑上开发 Android 应用程序,该应用程序将使用 wifi 通过 tcp 套接字与 pc 连接。

特别是我必须将图像流(例如未压缩的 BMP)传递给平板电脑。所以我做了简单的测试来检查带宽并且对结果感到失望。我将平板电脑放在 wifi 信号源前面,上面写着连接速度是每秒 54Mb,但考虑到测试结果,我每秒只能得到 ~16Mb。

测试代码:

个人电脑:

    public static void main(String[] args) throws Exception 
    {
        Socket socket = new Socket(androidIpAddr, port);

        OutputStream output = socket.getOutputStream();

        byte[] bytes = new byte[1024 * 100]; // 10K
        for (int i = 0; i < bytes.length; i++) {
            bytes[i] = 12;
        } // fill the bytes

        // send them again and again
        while (true) {
            output.write(bytes);
        }
     }

安卓:

public class MyActivity extends Activity {
/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);       

    new Thread(new Runnable() 
      {
        public void run() 
         {
           ServerSocket server = new ServerSocket(port);
           Socket socket = server.accept();

           InputStream input = socket.getInputStream();
           long total = 0;
           long start = System.currentTimeMillis();

           byte[] bytes = new byte[1024 * 100]; // 10K

           // read the data again and again
           while (true) 
           {
             int read = input.read(bytes);
             total += read;
             long cost = System.currentTimeMillis() - start;
             if (cost > 100) 
             {
               double megaBytes = (total / (1024.0 * 1024));
               double seconds = (cost / 1000.0);

               System.out.println("Read " + total + " bytes, speed: " + megaBytes / seconds + " MB/s");
               start = System.currentTimeMillis();
               total = 0;
             }
           }                
        }
    }).start();

}

}

我错过了什么?

4

1 回答 1

1

好的,第一个 54Mbps 的 Wifi 是每秒54 x 1024 x 1024位。所以最大 6.75 MB/s。

我在我的网络上进行了实验,在我的 Windows 7 框中报告为 54 Mbps。在我的 Windows 7 机器(服务器)和 XP 机器(客户端)之间,我基本上使用上面的代码实现了 3.0 MB/s。

然后我在我的 Nexus 7(服务器)和 XP(客户端)之间运行相同的代码,得到 0.3 MB/s。因此速度显着下降。我将以下内容放在服务器线程的构造函数中:

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

在清单中:

<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

我也搬到了路由器附近,关闭了wifi,然后重新打开。它在 Nexus 7 上报告为 54Mbps,当我运行它时,我得到了 3.0 MB/s。

所以此时与 Windows 7 相同的结果和大约 44% 的理论网络吞吐量。

使用多个 TCP 连接可以让我们接近 100% 的吞吐量。

于 2013-02-24T10:56:30.300 回答