概述
最近在写优麒麟手机助手这个项目,优麒麟手机助手是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由四个层次组成:网络接口层、网络层、传输层、应用层。
什么是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();
}
}
最后
以上就是秀丽毛巾为你收集整理的【中期检查】 搭建Android服务器并与浏览器交互总结一的全部内容,希望文章能够帮你解决【中期检查】 搭建Android服务器并与浏览器交互总结一所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复