Android学习六:Socket 使用

1socket的作用

通过http去获取服务器的数据在有些情况下是行不通的,所有使用socket与服务器通信也是必须掌握的

2.代码

好了上代码,代码中有解释,首先是简单的服务端代码

package org.tonny;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class SockServer implements Runnable
{
    private static final int PORT = 55555;

    @Override
    public void run()
    {
        //用于响应客户端
        Socket client = null;

        //服务端socket
        ServerSocket server = null;
        try
        {
            //绑定端口,准备接受客户端的连接
            server = new ServerSocket(PORT);
            while (true)
            {
                System.out.println("Wait for connecting...");

                //这个操作是阻塞的,有客户端连接才会进行下一步操作
                client = server.accept();

                //读取客户端发送的数据
                BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                String msg = in.readLine();
                System.out.println("Client:  " + msg);
            }
        }
        catch (Exception e)
        {
            System.out.println("Server Receive: Error");
        }
        finally
        {
            try
            {
                //关闭套接字
                server.close();
                client.close();
            }
            catch (IOException e)
            {
                System.out.println("Server Receive: Error" + e.getMessage());
            }
        }
    }

    public static void main(String[] args)
    {
        Thread thread = new Thread(new SockServer());
        thread.start();
    }
}

接着是android客户端的代码

package org.tonny.client;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class ClientActivity extends Activity
{
    // 需要发送的信息写在这个控件中
    private EditText txtInfo = null;
    private static final int PORT = 55555;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client);
        txtInfo = (EditText) this.findViewById(R.id.txtInfo);
    }

    public void onBtnSendClick(View view)
    {
        String msg = txtInfo.getText().toString();

        //不適用綫程通不过去,直接异常处理,这是因为android 3.0+以上 已经不建议在activity中添加耗时操作,要界面和数据脱离。4.0以上的通信都必须放到线程里去做 不能在UI线程。
        //解决办法,另起线程或Service处理socket。
        SockClient sock = new SockClient("192.168.1.106", PORT, msg);
        sock.start();
    }

    private final class SockClient extends Thread
    {
        private String ip;
        private int port;
        private String msg;

        public SockClient(String ip, int port, String msg)
        {
            this.ip = ip;
            this.port = port;
            this.msg = msg;
        }

        @Override
        public void run()
        {
            Socket client = null;
            try
            {
                Log.d("CLIENT", "Connecting...");
                // 与服务器获取连接
                client = new Socket(ip, port);
                // 获取 Client 端的输出流
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
                out.println(msg);
            }
            catch (UnknownHostException e)
            {
                Log.e("CLIENT", "Error", e);
            }
            catch (IOException e)
            {
                Log.e("CLIENT", "Error", e);
            }
            catch (Exception e)
            {
                Log.e("CLIENT", "Error", e);
            }
            finally
            {
                try
                {
                    if (client != null && !client.isClosed())
                    {
                        client.close();
                    }

                }
                catch (IOException e)
                {
                    Log.e("TCP", "Error", e);
                }
            }
        }
    }
}

要注意的是,socket操作一定要在单独的线程中进行,否则会产生异常。

3.总结

还是一点,android操作socket的时候,应该在线程中执行,否则会报异常,为了这个花了不少时间调试,还是没搞定,最后问的度娘。

时间: 2024-10-29 19:10:10

Android学习六:Socket 使用的相关文章

android学习六(android中四种基本布局)

前面学习了android中的基本组件的使用,这一篇,我将总结下android中布局的使用,详细的看下面. 1.LinearLayout LinearLayoutyot又称线性布局,是一种常用的布局,它又可以有水平方向的和垂直方向的布局方式.前面一篇博文基本使用的是线性布局中的垂直布局,这个垂直布局的的方式是有属性android:orientation="vertical"控制的.如果把值指定为horizontal则控件就会在水平方向上排列了.下面我进行实战的操作吧. 新建一个andro

Android学习六---OpenCV for android samples

搭建好OpenCV4Android环境后,就要着手开发自己的应用了.对于一个没有OpenCV基础的人来开发OpenCV应用确实有点难度,不过我们可以从samples里学起,结合javadoc和万能的网络开发一个简单的应用应该不难.为了简单,我们采用的是纯粹的java API不涉及JNI,等对这一部分熟悉之后再来采用JNI实现. 首先对OpenCV的android应用来个感性的认识,把samples中的image-manipulations安装到手机上(手机上先安装好OpenCV manager

android 学习六 构建用户界面和使用控件

1.常用Android控件最终都会继承自View类 2.ViewGroup是一些布局类列表的基类,包括View和ViewGroup 3.构造界面的三种方法 a.完全使用代码(太灵活,而不好维护) b.在xml文件中定义(不太灵活) c.结合两种方法,在xml文件中定义静态部份,在代码中实现灵活部分 4.定义 视图.部件.控件:表示一种用户界面元素 容器:包含视图的视图.例如网格,网格中的每一个单元格是一个视图 布局:容器和视图的可视排列,可以包含其他布局. 5.文本控件 a.TextView,比

Android学习路线(六)为Android应用添加ActionBar

Action bar 是你可以为你的应用的Activity实现的最为重要的设计元素之一.它提供了集中UI特性,并且通过提供和其他的Android应用的一致性体验让你的应用能够很快被用户熟悉.主要的功能包括: 一个专用的显示应用表示的地方,并且能够指出用户当前在应用中的位置. 用户能够很方便地访问重要的功能(例如搜索). 提供视图切换导航(通过tab,或者下拉列表). 这次的训练课程提供了对action bar基础知识的快速引导.有关action bar的各种特性的更多信息,请查看Action B

Android学习笔记(十六)——碎片之间进行交互(附源码)

碎片之间进行交互 点击下载源码 很多时候,一个活动中包含一个或者多个碎片,它们彼此协作,向用户展示一个一致的UI.在这种情况下,碎片之间能进行通信并交换数据十分重要. 1.使用上一篇中创建的同一个项目,在fragment.xml中添加TextView的标识id: android:id="@+id/lblFragment1" 2.在fragment2.xml中添加一个Button,用于与fragment1进行交互: <Button android:id="@+id/btn

六、Android学习笔记_JNI_c调用java代码

1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // C调用java空方法 public void helloFromJava() { System.out.println("hello from java"); } // C调用java中的带两个int参数的方法 public int Add(int x, int y) { int res

六、Android学习第五天——Handler的使用(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不能写在Activity中的,例如说下载或者处理大量的数据等,如果这类操作写在Activity中,就有可能导致整个Activity无响应甚至报错,这样用户体验就会比较差.所以此类功能应该独立于Activity,且互不干扰,所以Handler就应运而生了.Handler提供了一个异步的消息处理的方案,将

Android学习路线(十六)支持不同设备

全世界的Android 设备有很多很多不同的形状和大小.凭借着广泛的设备类型,你的应用程序可以有机会拥有一个庞大的用户群.为了让你的应用在android平台上更成功,你的应用需要适配各种设备类型.有几个重要的差异必须被考虑进去,包括不同的语言,屏幕尺寸以及android平台版本. 这篇课程会教你如何使用基本的平台特性,利用可选的资源以及其他的特性来让你的应用能够在多种Android兼容设备上提供最佳的用户体验,使用一个简单的应用包(APK). 课程 支持不同语言 学习如何通过可选的资源来支持多语

【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference

目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供MultiSelectListPreference,它的实现和ListPreference相似,不同的是还可以不选择或者多个选择.如图所示. XML文件 在复合例子中加入相关的内容,如下.同样地可以采用@array来对entry和entryvalue进行定义,使用比CheckBox Preference要方