您的位置:首页 > 移动开发 > Android开发

【中期检查】 搭建Android服务器并与浏览器交互总结一

2014-08-07 19:04 399 查看
最近在写优麒麟手机助手这个项目,优麒麟手机助手是Ubuntu Kylin组织的开源项目:

在Windows平台上有众多的安卓手机管理工具,如360手机助手、腾讯手机管家、豌豆荚等,但是在Linux平台下却鲜有功能强大的客户端出现。为了一解我等Linuxer在学习工作中手机管理的诸多不变,真心需要开发一款可在Linux环境下运行的图形化安卓手机管理工具,且称之为优麒麟手机助手。基于Android工具的各项功能进行开发,包括软件界面界设计、交互命令执行等,使用户感受不到adb的存在(当然,如果您足够Hacker也可以抛弃adb基于数据线或wifi等连接方式,自己编写超级手机hack进程,与Linux客户端交互并执行各种手机管理功能。难度系数:疯狂or自杀)。

这个项目希望能在Ubuntu Kylin操作系统下有一款独特的Android手机管理软件。经过和导师讨论,最终决定先解决无线连接。

前些年,很多人会说在Android端搭建服务器没有意义,而随着家庭局域网的发展,Android手机作为服务器的意义也逐渐显现,对于一个程序员来说,随身携带一个服务器本来就是很酷的事情。服务器开启,发一个Wifi,如果你蹭程序员的网络,那你就要小心了~

在这里要特别感谢Jonas导师,一直以来我都太关注代码,很少思考,东西做完了也就扔了。代码本身是没有意义的,且码且珍惜吧。
什么是TCP/IP协议
TCP/IP协议是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。它是70年代中期美国国防部为其ARPANET广域网开发的网络体系结构和协议标准,以它为基础组建的INTERNET是目前国际上规模最大的计算机网络,正因为INTERNET的广泛使用,使得TCP/IP成了事实上的标准。之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。

层次概述



从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。



什么是Socket
它实际上是网络通信的一种接口,基于不同的协议,有各种不同的Socket,比如有基于TCP协议的Socket和基于UDP协议的Socket以及基于蓝牙协议的Socket,Android中使用的是Java的Socket模型。

    Socket在计算机行业通常称为”套接字“,用于描述IP地址和端口,是一个通信链的句柄。这是一个比较抽象的概念。计算机是拥有端口的,每一个端口都可以有一个应用程序来进行通讯的使用,比如:80端口是HTTP协议所使用的端口,21端口是FTP协议所使用的端口,端口是计算机和外界通讯的接口,这些接口都是逻辑的接口,端口号取值的范围是零到256乘以256减1,1024以下的端口都是操作系统使用的保留端口,以上的端口我们可以自由的来使用,不要和其他应用程序的端口冲突。

    应用程序可以通过“套接字”向网络发送请求或者应答网络的请求,这时候就把Socket分成了两部分,一部分是服务器端的Socket,这个Socket主要用来接收来自网络的请求,它一直监听在某一个端口上。一部分是客户端的Socket,这个Socket主要用来向网络发送数据。

  





Http连接和Socket连接的区别
TCP/IP是网络传输协议,分为四层:网络接口层、网络层、传输层和应用层。

TCP协议和UDP协议都在传输层,而Socket则是针对TCP协议和UDP协议的编程接口,是网络通信中端点的抽象表示。包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

HTTP协议则是存在于应用层,是建立在TCP协议之上的应用。HTTP连接是一种“短连接”,HTTP在每次请求结束后都会主动释放连接,客户端也无法向服务器推送消息。


最简单的Android服务器实现
总体来说Android端实现服务器和Web服务器没什么区别,通过ServerSocket监听一个端口,并为每个客户端分配一个ClientSocket。

通过Android API获取在Wifi网络下的地址,并可通过同一网段下的PC浏览器进行访问。

package com.example.androidserver;



import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;



import android.app.Activity;

import android.content.Context;

import android.net.wifi.WifiInfo;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.view.Menu;

import android.widget.TextView;



public class MainActivity extends Activity {



private TextView tv_ip;

private TextView tv_mac;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);




new ServerThread().start();



tv_ip = (TextView) findViewById(R.id.tv_ip);

tv_mac = (TextView) findViewById(R.id.tv_mac);



tv_ip.setText(getLocalIpAddress());

tv_mac.setText(getLocalMacAddress());

}



@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}



class ServerThread extends Thread{


public void run() {

ServerSocket serverSocket = null;



try {

serverSocket = new ServerSocket(8888);

Socket client = null;

DataOutputStream out = null;

while (true) {


try {


// 监听客户端,调用ServerSocket的accept()方法,接受客户端所发出的请求


//如果客户端没有发送请求,会阻塞,一直等待accept函数的返回



System.out.println("开启服务器!" );



client = serverSocket.accept();



System.out.print("服务器成功开启!!");



//从Socket中得到InputStream对象



int temp = 0;



byte[] RecBuff = new byte[1024];



InputStream inputStream = client.getInputStream();



System.out.println("server get inputstream" );



// 从Inputstream当中读取客户端的命令



temp = inputStream.read(RecBuff);



for(int i= 0;i



System.out.println(RecBuff[i]);



System.out.println("读取完毕");



//向客户端发送数据




out =new DataOutputStream



((OutputStream) client.getOutputStream());



out.writeBytes("Android Server Test!");



System.out.println("before send");



out.flush();



System.out.println("server send message");



} catch (IOException e) {



// TODO Auto-generated catch blockg



e.printStackTrace();


} finally {



if (client != null) {



client.close();



}





if (out != null) {



out.close();



}


}

}

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

}



public String getLocalIpAddress() {




WifiManager wifiManager = (WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);


WifiInfo wifiInfo = wifiManager.getConnectionInfo();


int ipAddress = wifiInfo.getIpAddress();


try {



return InetAddress.getByName(



String.format("%d.%d.%d.%d", (ipAddress & 0xff),



(ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff),



(ipAddress >> 24 & 0xff))).toString();


} catch (UnknownHostException e) {


// TODO Auto-generated catch block


e.printStackTrace();

}

return null;

}



// 获取本机的物理地址

public String getLocalMacAddress() {

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

WifiInfo info = wifi.getConnectionInfo();

return info.getMacAddress();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: