zoukankan      html  css  js  c++  java
  • Android的三种网络通信方式

    转自http://blog.csdn.net/yuzhiboyi/article/details/7743390

    Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口)、Org.apache接口和Android.net.*(Android网络接口)。下面分别介绍这些接口的功能和作用。
    1.标准Java接口
    java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及,我们看一个简单的socket编程,实现服务器回发客户端信息。
    服务端:

    public class Server implements Runnable{
        @Override
        public void run() {
            Socket socket = null;
            try {
                ServerSocket server = new ServerSocket(18888);
                //循环监听客户端链接请求
                while(true){
                    System.out.println("start...");
                    //接收请求
                    socket = server.accept();
                    System.out.println("accept...");
                    //接收客户端消息
                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String message = in.readLine();
                    //发送消息,向客户端
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
                    out.println("Server:" + message);
                    //关闭流
                    in.close();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if (null != socket){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            
        }
        //启动服务器
        public static void main(String[] args){
            Thread server = new Thread(new Server());
            server.start();
        }
    }

    客户端,MainActivity

    public class MainActivity extends Activity {
        private EditText editText;
        private Button button;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            editText = (EditText)findViewById(R.id.editText1);
            button = (Button)findViewById(R.id.button1);
            
            button.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Socket socket = null;
                    String message = editText.getText().toString()+ "
    " ;
                    try {
                        //创建客户端socket,注意:不能用localhost或127.0.0.1,Android模拟器把自己作为localhost
                        socket = new Socket("<span style="font-weight: bold;">10.0.2.2</span>",18888);
                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
                                (socket.getOutputStream())),true);
                        //发送数据
                        out.println(message);
                        
                        //接收数据
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String msg = in.readLine();
                        if (null != msg){
                            editText.setText(msg);
                            System.out.println(msg);
                        }
                        else{
                            editText.setText("data error");
                        }
                        out.close();
                        in.close();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    finally{
                        try {
                            if (null != socket){
                                socket.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
        }
    }

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:text="@string/hello" />
        <EditText android:layout_width="match_parent" android:id="@+id/editText1"
            android:layout_height="wrap_content"
            android:hint="input the message and click the send button"
            ></EditText>
        <Button android:text="send" android:id="@+id/button1"
            android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>

    启动服务器:

    javac com/test/socket/Server.java
    java com.test.socket.Server

    运行客户端程序:

    结果如图:

    注意:服务器与客户端无法链接的可能原因有:
    没有加访问网络的权限:<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    IP地址要使用:10.0.2.2
    模拟器不能配置代理。

    2。Apache接口
    对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。
    下面我们以一个简单例子来看看如何使用HttpClient在Android客户端访问Web。
    首先,要在你的机器上搭建一个web应用myapp,只有很简单的一个http.jsp
    内容如下:

    <%@page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <html>
    <head>
    <title>
    Http Test
    </title>
    </head>
    <body>
    <%
    String type = request.getParameter("parameter");
    String result = new String(type.getBytes("iso-8859-1"),"utf-8");
    out.println("<h1>" + result + "</h1>");
    %>
    </body>
    </html>

    然后实现Android客户端,分别以post、get方式去访问myapp,代码如下:
    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:gravity="center"
        android:id="@+id/textView"  
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        />
    <Button android:text="get" android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content"></Button>
    <Button android:text="post" android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>

    资源文件:
    strings.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">通过按钮选择不同方式访问网页</string>
        <string name="app_name">Http Get</string>
    </resources>

    主Activity:

    public class MainActivity extends Activity {
        private TextView textView;
        private Button get,post;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            textView = (TextView)findViewById(R.id.textView);
            get = (Button)findViewById(R.id.get);
            post = (Button)findViewById(R.id.post);
            
            //绑定按钮监听器
            get.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //注意:此处ip不能用127.0.0.1或localhost,Android模拟器已将它自己作为了localhost
                    String uri = "http://192.168.22.28:8080/myapp/http.jsp?parameter=以Get方式发送请求";
                    textView.setText(get(uri));
                }
            });
            //绑定按钮监听器
            post.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    String uri = "http://192.168.22.28:8080/myapp/http.jsp";
                    textView.setText(post(uri));
                }
            });
        }
        /**
         * 以get方式发送请求,访问web
         * @param uri web地址
         * @return 响应数据
         */
        private static String get(String uri){
            BufferedReader reader = null;
            StringBuffer sb = null;
            String result = "";
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(uri);
            try {
                //发送请求,得到响应
                HttpResponse response = client.execute(request);
                
                //请求成功
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                    reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                    sb = new StringBuffer();
                    String line = "";
                    String NL = System.getProperty("line.separator");
                    while((line = reader.readLine()) != null){
                        sb.append(line);
                    }
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            finally{
                try {
                    if (null != reader){
                        reader.close();
                        reader = null;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != sb){
                result =  sb.toString();
            }
            return result;
        }
        /**
         * 以post方式发送请求,访问web
         * @param uri web地址
         * @return 响应数据
         */
        private static String post(String uri){
            BufferedReader reader = null;
            StringBuffer sb = null;
            String result = "";
            HttpClient client = new DefaultHttpClient();
            HttpPost request = new HttpPost(uri);
            
            //保存要传递的参数
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            //添加参数
            params.add(new BasicNameValuePair("parameter","以Post方式发送请求"));
            
            try {
                //设置字符集
                HttpEntity entity = new UrlEncodedFormEntity(params,"utf-8");
                //请求对象
                request.setEntity(entity);
                //发送请求
                HttpResponse response = client.execute(request);
                
                //请求成功
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                    System.out.println("post success");
                    reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                    sb = new StringBuffer();
                    String line = "";
                    String NL = System.getProperty("line.separator");
                    while((line = reader.readLine()) != null){
                        sb.append(line);
                    }
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            finally{
                try {
                    //关闭流
                    if (null != reader){
                        reader.close();
                        reader = null;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != sb){
                result =  sb.toString();
            }
            return result;
        }
    }

    运行结果如下:

    3.android.net编程:
    常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。这里不详细讲。

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
    倍福TwinCAT(贝福Beckhoff)基础教程 松下绝对值驱动器如何做初始化设置
    倍福TwinCAT(贝福Beckhoff)基础教程 松下官方软件开启报错伺服未就绪怎么办
    JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  • 原文地址:https://www.cnblogs.com/shide/p/3378528.html
Copyright © 2011-2022 走看看