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

该项目旨在为Linux用户提供一款功能强大的Android手机管理工具。通过无线连接技术,用户可以在UbuntuKylin系统中便捷管理Android设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写优麒麟手机助手这个项目,优麒麟手机助手是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();

}

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值