android-关于socket编程(附上如何获取安卓机的ip)

学习了一下关于socket编程。

在安卓上面,socket编程分为两种,TCP和UDP,至于这两种有什么区别,

TCP:面向连接的,安全的,速度慢,会反馈确定收到的

UDP:不链接的,不安全的,速度快,不确定是否已经接收到


首先先附上安卓机上的代码:

TCP Socket的代码

class TCPThread extends Thread {
        @Override
        public void run() {
            Log.i("juetion", "TCPThread  runing");
            int i = 0;
            while (!this.isInterrupted()) {  //判断是否中断线程
                ServerSocket serverSocket = null;//声明一个ServerSocket对象
                Log.i("juetion", "TCPThread run times:" + (i));
                i++;
                try {
                    serverSocket = new ServerSocket(12345);//创建一个ServerSocket对象,并在12345端口监听
                    Socket socket = serverSocket.accept();//接受客户端发送的请求
                    InputStream inputStream = socket.getInputStream();//获取数据流
                    byte buffer[] = new byte[1024 * 4];
                    int temp = 0;
                    while ((temp = inputStream.read(buffer)) != -1) {
                        Log.i("juetion", new String(buffer, 0, temp));  //数据输出
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    Log.i("juetion", "serverSocket  close");
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

UDP Socket 的代码:

class UDPThread extends Thread {
        @Override
        public void run() {
            Log.i("juetion", "UDPThread  runing");
            int i = 0;
            while (!this.isInterrupted()) {//判断是否中断线程
                DatagramSocket datagramSocket = null;//声明DatagramSocket对象
                Log.i("juetion", "UDPThread run times:" + (i));
                i++;
                try {
                    datagramSocket = new DatagramSocket(12345);//创建对象,并监听12345端口
                    byte data[] = new byte[1024];
                    DatagramPacket datagramPacket = new DatagramPacket(data, data.length); //获取数据包
                    datagramSocket.receive(datagramPacket);//接受数据
                    Log.i("juetion", "" + new String(datagramPacket.getData(), datagramPacket.getOffset(), datagramPacket.getLength()));//数据输出
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Log.i("juetion", "datagramSocket  close");
                datagramSocket.close();
            }
        }
    }

上面的两段代码,相信大家都看得懂,而且也有注释了。

两段代码都是以子线程的方式运行。因为数据传输的问题,不要在主线程运行,这样会导致主线程堵塞。

关于代码中的判断线程终止的问题。是为了线程可以完整运行,而不是中途抛错。是解决停止线程的一种方法,其他方法大家可以自己研究。

线程的启动和终止的代码:

@Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.startTCP:
                    tcpThread.start();
                    break;
                case R.id.stopTCP:
                    tcpThread.interrupt();
                    break;
                case R.id.startUDP:
                    udpThread.start();
                    break;
                case R.id.stopUDP:
                    udpThread.interrupt();
                    break;
            }
        }

好了,以上讲的都是服务器端的代码,也是安卓机上的代码。

------------------------------我是可爱的分界线--------------------------------------------------------------------------------

以下的代码是客户端的代码:

首先是TCP client的:

try {
			Socket socket = new Socket("10.121.97.185",12345);//前面的ip是服务器的ip,记住本程序要和服务器要可以ping通哦。端口是服务器12345的的端口
			InputStream inputStream = new ByteArrayInputStream("测试测试哦".getBytes());
			OutputStream outputStream = socket.getOutputStream();
			byte buffer[] = new byte[1024*4];
			int temp = 0;
			while ((temp = inputStream.read(buffer))!=-1) {
				outputStream.write(buffer, 0, temp);//写出数据
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

然后是UDP client的:

try {
			DatagramSocket datagramSocket = new DatagramSocket(12345);
			InetAddress inetAddress = InetAddress.getByName("192.168.2.101");//前面的ip是服务器的ip,记住本程序要和服务器要可以ping通哦。端口是服务器12345的端口
			String string = "测试测试";
			byte data[] = string.getBytes();
			DatagramPacket datagramPacket = new DatagramPacket(data, data.length,inetAddress,12345);//要发送的数据包
			datagramSocket.send(datagramPacket);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

说明,在安卓机上启动了TCP或者UDP的socket后,就可以使用下面客户端的代码。注释都很清楚。看一下就懂了。

附上代码:http://download.csdn.net/detail/juetion/6788979

好了,今月今日的学习复习就到此结束了,谢谢观看。

------------------------关于如何获取安卓机的ip--------------------------------------

以下代码来自:http://blog.csdn.net/hyz4287010/article/details/6888413

private String intToIp(int i) {
            return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF);
        }

        //获取wifi ip 和 mac
        public String getLocalMacAddress(Context context) {
            //获取wifi服务
            WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            //判断wifi是否开启,wifi未开启时,返回的ip为0.0.0.0
            if (!wifiManager.isWifiEnabled()) {
                wifiManager.setWifiEnabled(true);
            }
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            String Ip = intToIp(wifiInfo.getIpAddress());
            String Mac = wifiInfo.getMacAddress();
            return "WiFi->Ip:" + Ip + "\nWiFi->Mac:" + Mac;
        }
        //获取2G 3Gip
        public String getLocalIpAddress() {
            try {
                for (Enumeration<NetworkInterface> en = NetworkInterface
                        .getNetworkInterfaces();
                     en.hasMoreElements(); ) {
                    NetworkInterface intf = en.nextElement();
                    for (Enumeration<InetAddress> enumIpAddr = intf
                            .getInetAddresses();
                         enumIpAddr.hasMoreElements(); ) {
                        InetAddress inetAddress = enumIpAddr.nextElement();
                        if (!inetAddress.isLoopbackAddress()) {
                            return inetAddress.getHostAddress().toString();
                        }
                    }
                }
            } catch (SocketException ex) {
            }
            return null;
        }


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明是我的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值