判断网络

网络分wifi、3G、2G、无网络连接;

第一种方案:逻辑如下:
1、先判断当前有无网络;
2、有网络的情况下:
(1)、网络为wifi;
(2)、网络为3G;
(3)、网络为2G;

使用reachability里的KShouldPrintReachabilityFlags 就可以详细区分出wifi、3G、2G,重构一下就可以了;
网速 wifi>3G>2G

PS:当然还有一种情况就是网络连接不稳定,wifi、3G的网速有可能比2G慢.

第二种方案:
在服务器设置一个文件,在客户端下载,计算下载时间,不过几K的文件下载时间基本没啥区别,弄几M的文件下载,时间区别很大,但是用户的流量就被浪费了,所以不可取.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

//Reachability.m 中 networkStatusForFlags 方法重构

- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags

{

    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)

    {

        return NotReachable;

    }

    

    BOOL retVal = NotReachable;

    

    if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)

    {

        // if target host is reachable and no connection is required

        //  then we‘ll assume (for now) that your on Wi-Fi

        retVal = ReachableViaWiFi;

    }

    

    

    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||

         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))

    {

        // ... and the connection is on-demand (or on-traffic) if the

        //     calling application is using the CFSocketStream or higher APIs

        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)

        {

            // ... and no [user] intervention is needed

            retVal = ReachableViaWiFi;

        }

    }

    

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)

    {

        if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {

            if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {

                retVal = ReachableVia3G;

                if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {

                    retVal = ReachableVia2G;

                }

            }

        }

    }

    return retVal;

}

//检查当前网络连接是否正常

-(BOOL)connectedToNetWork

{

    struct sockaddr_in zeroAddress;

    bzero(&zeroAddress, sizeof(zeroAddress));

    zeroAddress.sin_len = sizeof(zeroAddress);

    zeroAddress.sin_family = AF_INET;

    

    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);

    SCNetworkReachabilityFlags flags;

    

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);

    CFRelease(defaultRouteReachability);

    

    if (!didRetrieveFlags) {

        printf("Error. Count not recover network reachability flags\n");

        return NO;

    }

    

    BOOL isReachable = flags & kSCNetworkFlagsReachable;

    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;

    return (isReachable && !needsConnection) ? YES : NO;

}

//检查网络连接类型

-(void)checkNetworktype:(id)sender{

    NSString *connectionKind;

    if ([self connectedToNetWork]) {

        hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];

        switch ([hostReach currentReachabilityStatus]) {

            case NotReachable:

                connectionKind = @"没有网络链接";

                break;

            case ReachableViaWiFi:

                connectionKind = @"当前使用的网络类型是WIFI";

                break;

            case ReachableVia3G:

                connectionKind = @"当前使用的网络链接类型是WWAN(3G)";

                break;

            case ReachableVia2G:

                connectionKind = @"当前使用的网络链接类型是WWAN(2G)";

                break;    

            default:

                break;

        }

    }else {

        connectionKind = @"没有网络链接";

    }

}

时间: 2024-08-03 04:54:19

判断网络的相关文章

判断网络状态

//判断网络是否连接 public static boolean Netisavilable(Context context){ //获得网络管理 ConnectivityManager cManager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //获得网络详情 NetworkInfo networkInfo=cManager.getActiveNetworkInfo(); if(

android中判断网络连接是否可用

一.判断网络连接是否可用 1 public static boolean isNetworkAvailable(Context context) { 2 ConnectivityManager cm = (ConnectivityManager) context 3 .getSystemService(Context.CONNECTIVITY_SERVICE); 4 if (cm == null) { 5 } else { 6 //如果仅仅是用来判断网络连接 7 //则可以使用 cm.getAc

iOS开发——Reachability和AFNetworking判断网络连接状态

一.Reachability // 监听网络状态改变的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil]; // 创建Reachability self.conn = [Reachability reachabilityForInternetConnecti

Android中判断网络连接是否可用及监控网络状态

Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android中判断网络连接是否可用及监控网络状态,感兴趣的朋友可以参考下 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

Android 判断网络链接

今天在做判断是否有网络连接时一直报错,后来才知道缺少了权限. 大家都知道Android连网需要添加权限: <uses-permission android:name="android.permission.INTERNET" /> 但是我们在判断时也需要添加访问权限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permis

socket.sendUrgentData判断网络远端是否断开连接

来自于 http://chenke1215.blog.163.com/blog/static/124414520103611222617/ 最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接. 首先想到socket类的方法isClosed().isConnected().isInputStreamShutdown().isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接. 然后

iOS 判断网络是否连接

1 //判断网络是否连接 2 + (BOOL) connectedToNetwork 3 { 4 //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态 5 struct sockaddr_in zeroAddress; //struct用来向方法中传递复杂的参数(把参数当作对象,这样便于扩展) 6 bzero(&zeroAddress, sizeof(zeroAddress)); 7 zeroAddress.sin_len = sizeof(zeroAddress); 8 zeroAd

iOS 判断网络连接状态的几种方法

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #801b80 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "Comic Sans MS"; color: #801b80 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Arial; col

android判断网络连接状态、联网类型、运营商

/** * 获取上网方式 * * @param mContext * @return */ public static String getNetType(Context mContext) { String netType = ""; ConnectivityManager connectionManager = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); Networ

c# 判断网络是连接到互联网

方法1:InternetGetConnectedState [System.Runtime.InteropServices.DllImport("wininet")] private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue); private void button1_Click(object sender, EventArgs e) {