我是靠谱客的博主 秀丽毛巾,最近开发中收集的这篇文章主要介绍【中期检查】 搭建Android服务器并与浏览器交互总结一,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

}

}

 

 

 

 

最后

以上就是秀丽毛巾为你收集整理的【中期检查】 搭建Android服务器并与浏览器交互总结一的全部内容,希望文章能够帮你解决【中期检查】 搭建Android服务器并与浏览器交互总结一所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部