Android中Socket的应用分析

本文实例分析了Android中Socket的应用。分享给大家供大家参考,具体如下:

Android 提供的常用的网络编程包括针对TCP/IP协议的Socket通信。Socket是一种跨平台的编程方式,可以在异构语言之间进行通信。

Socket程序的开发原理,是要实现服务器端和客户端。

服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

下面是一个实现socket的例子:

服务器端代码:

package com.socket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* com Server
*/
public class Main {
  private int ServerPort = 9999;
  private ServerSocket serversocket = null;
  private OutputStream outputStream = null;
  private InputStream inputStream = null;
  private PrintWriter printWinter = null;
  private Socket socket = null;
  private BufferedReader reader = null;
  public Main(){
    try{
      serversocket = new ServerSocket(ServerPort);
      System.out.println("服务启动。。。");
      socket = serversocket.accept();
      System.out.println("客户已连接");
    }catch(Exception ex){
      ex.printStackTrace();
    }
    try{
      outputStream= socket.getOutputStream();
      inputStream = socket.getInputStream();
      printWinter = new PrintWriter(outputStream,true);
      reader = new BufferedReader(new InputStreamReader(inputStream));
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      while (true){
        String message = reader.readLine();
        System.out.println("client:"+message);
        if(message.equals("bye")||message.equals("Bye")){
          break;
        }
        message = in.readLine();
        printWinter.println(message);
      }
      outputStream.close();
      inputStream.close();
      socket.close();
      serversocket.close();
      System.out.print("Client is disconnected");
    }catch(Exception e){
      e.printStackTrace();
    }finally{
    }
  }
  public static void main(String[] args){
    new Main();
  }
}

客服端代码:

package com.Aina.Android;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Test extends Activity implements Runnable {
/** Called when the activity is first created. */
private TextView tv_msg = null;
private EditText ed_msg = null;
private Button btn_send = null;
private Button btn_login = null;
private static final String HOST = "192.168.0.132";
private static final int PORT = 9999;
private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
private String content = "";
@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 tv_msg = (TextView) this.findViewById(R.id.TextView);
 ed_msg = (EditText) this.findViewById(R.id.EditText01);
 btn_login = (Button) this.findViewById(R.id.Button01);
 btn_send = (Button) this.findViewById(R.id.Button02);
 try {
  socket = new Socket(HOST, PORT);
  in = new BufferedReader(new InputStreamReader(socket
   .getInputStream()));
  out = new PrintWriter(new BufferedWriter(
   new OutputStreamWriter(socket.getOutputStream())),
   true);
 } catch (Exception ex) {
  ex.printStackTrace();
  ShowDialog("登陆异常:" + ex.getMessage());
 }
 btn_send.setOnClickListener(new Button.OnClickListener() {
  public void onClick(View v) {
  // TODO Auto-generated method stub
  String msg = ed_msg.getText().toString();
  if (socket.isConnected()) {
   if (!socket.isOutputShutdown()) {
   out.println(msg);
   }
  }
  }
 });
 new Thread(this).start();
}
public void ShowDialog(String msg) {
 new AlertDialog.Builder(this).setTitle("提示").setMessage(msg)
  .setPositiveButton("OK", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int which) {
   // TODO Auto-generated method stub
   }
  }).show();
}
public void run() {
 try {
  while (true) {
  if(socket.isConnected()){
   if(!socket.isInputShutdown()){
   if ((content = in.readLine()) != null) {
    Log.i("TAG", "++ "+content);
    content += "\n";
    mHandler.sendMessage(mHandler.obtainMessage());
   }else{
   }
   }
  }
  }
 } catch (Exception ex) {
  ex.printStackTrace();
 }
}
public Handler mHandler = new Handler() {
 public void handleMessage(Message msg) {
  super.handleMessage(msg);
  Log.i("TAG", "-- "+msg);
  tv_msg.setText(tv_msg.getText().toString() + content);
 }
};
}

XML文件布局:

<?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:id="@+id/TextView" android:singleLine="false"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" />
<EditText android:hint="content" android:id="@+id/EditText01"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
</EditText>
<Button android:text="login" android:id="@+id/Button01"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
</Button>
<Button android:text="send" android:id="@+id/Button02"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
</Button>
</LinearLayout>

先启动服务器端,再运行客户端程序。

注意:

(一)即使服务器端和客户端在一台机器上运行,也不能使用ip地址:127.0.0.1,否则,程序会出现拒绝连接的错误。

(二)客户端和服务器端最好不要建在一个工程下,最好是分别建立工程,然后启动服务器端和客户端,否则会报Error: ShouldNotReachHere()错误。这是因为Android程序不是已main方法为程序的入口。

运行效果:

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android通信方式总结》、《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android应用 坐标系详细介绍

    Android 应用坐标系详解: 由于最近做Android项目需要用坐标系的知识,所以度娘了一下,整理了相关资料,记录下来. 1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自定义控件,但是大多数都是授之以鱼,却很少有较为系统性授之于渔的文章,同时由于自己也迟迟没有时间规划这一系列文章,最近想将这一系列文章重新提起来,所以就来先总结一下自定义控件的一个核心知识点--坐标系. 很多人可能不屑一顾Android的坐标系,但是如果你想彻底学会自定义控件,我想说了解A

  • Android 动画之TranslateAnimation应用详解

    android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 TranslateAnimation 位移动画效果 RotateAnimation 旋转动画效果 本节讲解TranslateAnimation动画,TranslateAnimation比较常用,比如QQ,网易新闻菜单条的动画,就可以用TranslateAnimation实现, 通过TranslateAnimation(float fromXDelta, float toXD

  • Android 动画之RotateAnimation应用详解

    android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 TranslateAnimation 位移动画效果 RotateAnimation 旋转动画效果 本节讲解RotateAnimation 动画, RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivot

  • Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用示例

    本文实例讲述了Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用.分享给大家供大家参考,具体如下: 现在我们上网几乎都会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 里是如何实现的呢? 事实上,Android 的AutoCompleteTextView Widget ,只要搭配ArrayAdapter 就能设计同类似Google 搜索提示的效果. 本例子先在Layout 当中布局一个AutoCom

  • Android编程之重力感应用法分析

    本文实例讲述了Android编程之重力感应用法.分享给大家供大家参考,具体如下: 重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉.还是得根据真机的实际情况来做开发,下面主要讨论加速度传感器的具体实现方式,传感器名称如下: 加速度传感器(accelerometer) 陀螺仪传感器(gyroscope) 环境光照传感器(light)

  • Android TabWidget切换卡的实现应用

    TabWidget类似于Android 中查看电话薄的界面,通过多个标签切换显示不同内容.要实现这一效果,首先要了解TabHost,它是一个用来存放多个Tab标签的容器.每一个Tab都可以对应自己的布局,比如,电话薄中的Tab布局就是一个List的线性布局了. 要使用TabHost,首先需要通过getTabHost方法来获取TabHost的对象,然后通过addTab方法来向TabHost中添加 Tab.当然每个Tab在切换时都会产生一个事件,要捕捉这个事件需要设置TabActivity的事件监听

  • android通过配置文件设置应用安装到SD卡上的方法

    安装应用时,有时会出现存储空间不足的错误,这时就只能将应用安装到SD卡,在AndroidManifest.xml文件的manifest里面添加下面一行: 复制代码 代码如下: android:installLocation="preferExternal" 这样应用就会被安装在SD卡,不会出现存储空间不足的错误了.

  • Android 应用的安装过程详解

    Android 应用安装过程: 首先一个android项目,然后编译和打包,将.java文件编译为.class,.class编译为.dex,将所有文件打包为一个apk,只编译代码,不编译资源. .apk里面的.arsc是资源的索引,当资源比较多的时候,可以索引. signing-签名,系统在确认应用被覆盖之前,除了检测包名是否一致,还会检测签名是否相同.所以签名是一个公司的机密,起到版权保护的作用. 我们部署一个项目,不是把项目安装到手机上,而是先把apk安装包上传拷贝到手机上,在手机里面安装这

  • Android判断当前应用程序处于前台还是后台的两种方法

    1.通过RunningTaskInfo类判断(需要额外权限): 复制代码 代码如下: /**     *判断当前应用程序处于前台还是后台     */    public static boolean isApplicationBroughtToBackground(final Context context) {        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SER

  • Android开发笔记之:用Enum(枚举类型)取代整数集的应用详解

    在Android的API中可以发现有很多用整数集来作为参数的地方,先来看一下实例.LinearLayout是大家所熟知的一个UI基本元素,它里面有一个方向的属性,可以通过以下方法来设置: 复制代码 代码如下: LinearLayout.setOrientation(int); 使用的时候,通常都是这样: 复制代码 代码如下: LinearLayout.setOrientation(LinearLayout.HORIZONTAL);LinearLayout.setOrientation(Linea

随机推荐