Android网络:由手机与手机WIFI互传照片谈Android TCP Socket开

本文背景:局域网内手机与手机利用wifi建立tcp连接,通过socket互传照片。即一个手机当作服务器,另一个手机是客户端,客户端可以看到服务器指定文件夹内的图片缩略图,并选择下载到本机。另外,客户端会显示本地某个文件夹内的图片缩略图,并选择上传到服务器。总而言之本例中图片的发送和接收都是双向的。除发送图片外,还含有字符串(图片的名字)、文件夹内图片的个数(刷新适配器)的发送。

众所周知,android常用的网络开发无外乎http和socket,其中http是应用层的协议,tcp是传输层。所以,http也是用socket封装的,用起来更方便。由于是封装过的,它提供了更强大的功能。socket又分为TCP和UDP,局域网内TCP速度就很快了,鉴于局域网内传送东西不需要考虑流量,所以此种场合多用socket。首先看下本例的运行效果:

下面是客户端初始界面:

点击下载后进入下载界面,服务器就开始给客户端传缩略图和图片的名字了,如下:

选择需要下载的图片:

点击确定按钮后,服务器就开始给客户端传大图了,就是原始图片,传输完毕后,弹出提示框:

点击上面的确定后,就自动结束当前activity,返回到初始界面,就不附图了。

下面是客户端的上传界面,将图片上传到服务器上,这个没啥难的,就是本地图片生成缩略图填充到listview上,不涉及到网络部分。其传输,跟服务器往客户端传东西是一样的。:

最后来看下服务器,由于服务器没任何UI上的要求,所以就是些简单的log打印:

本以为很简单的一个功能,但网上大多数是手机是客户端,PC是服务端。虽然都是流传输,但服务器在PC和手机上解析成图片还是不大一样的,中间走了很多弯路才搞定,另外,就是网上大多是简单的收发,本例中既要传输图片个数、图片名字等,客户端牵涉到切换到activity,要多个socket链接,还是有些麻烦的。下面把开发中遇到的问题、开发要点和步骤记录下来。

1、权限问题

这里包括WIFI权限,Internet权限和文件读写权限。我第一次的时候权限没添加完,来来回回折腾了好几次。服务器和客户端的权限是一样的.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />2、服务器再开启服务前,首先要判断WIFI是否连接,如果没有WIFI连接应该弹出个提示框。如果有WIFI连接上了,则进一步提取出IP地址。我将其封装到NetworkUtil类里弄成静态方法,如下:package org.yanzi.util;import android.content.Context;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;public class NetworkUtil {/** *判断wifi是否连接 * @param context * @return */public static boolean isWiFiConnected(Context context){ConnectivityManager connectManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);if(networkInfo.isConnected()){return true;}else{return false;}}/** * 得到wifi连接的IP地址 * @param context * @return */public static String getWifiIP(Context context){WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();int ipAddr = wifiInfo.getIpAddress();String ipStr = int2string(ipAddr);return ipStr;}/** * 输入int 得到String类型的ip地址 * @param i * @return */private static String int2string(int i){return (i & 0xFF)+ "." + ((i >> 8 ) & 0xFF) + "." + ((i >> 16 ) & 0xFF) +"."+((i >> 24 ) & 0xFF );}}在wifi地址这块,当时还参考了网上一个,但是转出来的string类型的IP地址是错误的,上面贴的代码是正确的。如果wifi没有连接,则弹出提示框报错:public void showAlterDialog(){Dialog alterDialog = new AlertDialog.Builder(this).setTitle("警告").setMessage("当前WiFi没有正常连接,请连接后再操作.").setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubdialog.dismiss();}}).create();alterDialog.show();}享受每一刻的感觉,欣赏每一处的风景,这就是人生。

Android网络:由手机与手机WIFI互传照片谈Android TCP Socket开

相关文章:

你感兴趣的文章:

标签云: