Android应用开发基础篇(12)-----Socket通信(转载)

转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html

一、概述

网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础。在进入正题之前,先介 绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的;二:一个TCP连接包括了输入和输出两条独立的 路径;三:服务器必须先运行然后客户端才能与它进行通信。四:客户端与服务器所使用的编码方式要相同,否则会出现乱码。下面的实现中为了讲解的方便,并没有采用多线程的方法,因此通信过程中会阻塞UI线程,而且只涉及了单向通信(客户端-->服务器),完善的程序(多线程,双向通信)会在提高篇再讲解。

二、要求

熟悉socket编程。

三、实现

新建工程MyClient,修改/res/layout/main.xml文件,在里面添加一个EditText和两个Button,完整的main.xml文件如下:

[代码]xml代码:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

     <EditText
         android:id="@+id/edittext"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:hint="请输入要发送的内容"
         />

     <Button
         android:id="@+id/connectbutton"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="连接"
         />

     <Button
         android:id="@+id/sendbutton"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="发送"
         />

 </LinearLayout>

接着,修改MyClientActivity.java文件,定义一个socket对象和一个OutputStream对象(用于发送数据),完整的内容如下:

[代码]java代码:

package com.nan.client;

 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.Socket;
 import java.net.UnknownHostException;

 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;

 public class MyClientActivity extends Activity
 {
     private EditText mEditText = null;
     private Button connectButton = null;
     private Button sendButton = null;

     private Socket clientSocket = null;
     private OutputStream outStream = null;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mEditText = (EditText)this.findViewById(R.id.edittext);
         connectButton = (Button)this.findViewById(R.id.connectbutton);
         sendButton = (Button)this.findViewById(R.id.sendbutton);
         sendButton.setEnabled(false);      

         //连接按钮监听
         connectButton.setOnClickListener(new View.OnClickListener()
         {

             @Override
             public void onClick(View v)
             {
                 // TODO Auto-generated method stub
                 try
                 {
                     //实例化对象并连接到服务器
                     clientSocket = new Socket("183.41.101.71",8888);
                 }
                 catch (UnknownHostException e)
                 {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 catch (IOException e)
                 {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }

                 displayToast("连接成功!");            

                 connectButton.setEnabled(false);
                 sendButton.setEnabled(true);
             }
         });

         //发送数据按钮监听
         sendButton.setOnClickListener(new View.OnClickListener()
         {

             @Override
             public void onClick(View v)
             {
                 // TODO Auto-generated method stub
                 byte[] msgBuffer = null;
                 //获得EditTex的内容
                 String text = mEditText.getText().toString();
                 try {
                     //字符编码转换
                     msgBuffer = text.getBytes("GB2312");
                 } catch (UnsupportedEncodingException e1) {
                     // TODO Auto-generated catch block
                     e1.printStackTrace();
                 }

                 try {
                     //获得Socket的输出流
                     outStream = clientSocket.getOutputStream();
                 } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }                                                    

                 try {
                     //发送数据
                     outStream.write(msgBuffer);
                 } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }

                 displayToast("发送成功!");
             }
         });

     }

     //显示Toast函数
     private void displayToast(String s)
     {
         Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
     }

 }

接着,新建工程MyServer,同样修改/res/layout/main.xml文件,如下:

[代码]xml代码:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

     <TextView
         android:id="@+id/textview"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:textSize="15dip"

         />

 </LinearLayout>

修改MyServerActivity.java文件,比较简单,代码中有详细注释,如下:

[代码]java代码:

package com.nan.server;

 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.ServerSocket;
 import java.net.Socket;

 import android.app.Activity;
 import android.os.Bundle;
 import android.widget.TextView;

 public class MyServerActivity extends Activity
 {
     private TextView mTextView = null;

     private InputStream mInputStream = null;
     private Socket clientSocket = null;
     private ServerSocket mServerSocket = null;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mTextView = (TextView)this.findViewById(R.id.textview);

         try {
             //实例化ServerSocket对象并设置端口号为8888
             mServerSocket = new ServerSocket(8888);
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

         try {
             //等待客户端的连接(阻塞)
             clientSocket = mServerSocket.accept();
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

         try {
             //获得socket的输入流
             mInputStream = clientSocket.getInputStream();
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

         byte[] buf = new byte[512];
         String str = null;

         try {
             //读取输入的数据(阻塞读)
             mInputStream.read(buf);
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

         try {
             //字符编码转换
             str = new String(buf, "GB2312").trim();
         } catch (UnsupportedEncodingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         //显示接收到的数据
         mTextView.setText("收到的数据:"+str);

     }

 }

最后在两个工程的AndroidMainfest.xml文件中都加入权限:

1 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

到这里,客户端和服务器的程序都写好了,在模拟器上运行客户端程序:

在真机上运行服务器程序:

接着,点击客户端“连接”按钮,输入一些内容再点击“发送”按钮:

此时服务器端的情况如下:

可见成功接收了客户端发送过来的数据。

时间: 2025-01-18 12:36:04

Android应用开发基础篇(12)-----Socket通信(转载)的相关文章

Android应用开发基础篇(3)-----ListView

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/16/2354625.html 一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView显示一些内容,如数据.文本,某一行被点击时有相应的提示:能够实现简单的ListView的动态插入和删除. 三.实现 新建工程MyListView,修改/res/lay

Android应用开发基础篇(4)-----TabHost(选项卡)

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/18/2357093.html 一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不一样. 二.要求 实现一个具有三个标签的选项卡,每个标签使用不同的布局作为内容,当切换不同的标签时向用户发出提示. 三.实现      声明:这个应用需要用到前面一篇

Android应用开发基础篇(9)-----SharedPreferences

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/27/2370319.html 一.概述 对于SharedPreferences,我吧它理解为一种简单的数据库,它可以把数据像文件一样存放在系统里面,也可以读出来,但它存放的只是一些简单的数值对,如key-values的形式.如果某些应用需要在退出时保存一些简单的数据以便再次被打开时恢复所需的数据,那么就可以用SharedPreferences来实现. 二.要求 编写一个简单的应用,要求该应用退

Android应用开发基础篇(13)-----GestureDetector(手势识别)

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/05/2381025.html 一.概述 GestureDetector是一个用于识别手势的类,这里所讲的手势识别,不是模式识别里所讲的手势(用户的手在用摄像头前做的动作)识别,而是说用户的手在触摸屏上做的手势(比如滑动等),它可以识别一般的手势,也可以识别用户自定义的手势. 二.要求 利用GestureDetector.ViewFlipper类实现两个View之间的切换. 三.实现 新建工程M

Android应用开发基础篇(12)-----Socket通信

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服

Android应用开发基础篇(6)-----Service

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/20/2360336.html 一.概述 我们知道,Service是Android的四大组件之一.在我看来,Service可以理解为一种在后台运行的服务,但它不是运行在一个独立的线程中,而是运行在主线程里,当程序有比较“繁重”的任务要执行时,就可以把它放在Service中执行.Service也有自己的生命周期,与Activity有点类似,但它没有用户界面,只在后台运行. 二.要求 编写一个带有S

Android应用开发基础篇(5)-----Handler与多线程

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/19/2358155.html 一.概述 Handler这个类主要用来发送和处理消息的.它有多个发送消息函数,但只有一个处理消息函数handleMessage(). 二.要求 程序中有两个线程,一个是UI线程,一个是自己创建的线程,在自己创建的线程中发送消息,在UI线程中接收并处理这个消息. 三.实现 不仅是Android,很多其他界面编程都是不允许在其他线程中直接更新UI界面的.因此可以在其他

Android应用开发提高篇(1)-----获取本地IP

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的).好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单.下面的实现只可

Android应用开发进阶篇-场景文字识别

由于研究生毕业项目需要完成一个基于移动终端的场景文字识别系统,虽然离毕业尚早,但出于兴趣的缘故,近一段抽时间完成了这样一套系统.基本的架构如下: 客户端:Android应用实现拍摄场景图片,大致划出感兴趣文字区域,通过socket通信上传服务器端识别; 服务器端:Python server进行socket通信监听,连通后调用文字识别引擎(exe可执行程序),将识别结果返回; 下面是系统运行示例图: 1. 客户端 包含两个Activity,: MainActivity主界面如上图左1,选择拍摄后调