Android之简单的Socket通信

一、Android客户端:

1、首先需要在AndroidMainfest.xml文件中添加网络访问权限:

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

2、下面是主要的主要的TestSocket.java(此处TestSocket为主Activity)代码:

import java.io.*;

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.Button;

import android.widget.EditText;

import android.widget.TextView;

//客户端的实现

/**

 * 步骤:

 * 1、取得组件

 * 2、设置事件监听(执行socket操作)

 * 3、在监听事件中socket操作的步骤:

 *    1)组织向服务器端发送的数据

 *     2)新建socket对象

 *     3)新建输出流,向服务器端发送数据

 *     4)新建输入流,接收服务器端数据

 *    5)关闭流对象

 *    6)关闭socket对象

 * */

public class TestSocket extends Activity {

         private TextView text1;//文本控件

         private Button but1;//按钮

         private EditText edit1;//文本输入框

         private final String DEBUG_TAG="mySocketAct";//输出日志标记

 

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        text1=(TextView)findViewById(R.id.text1);

        //取得组件

        but1=(Button)findViewById(R.id.but1);

        edit1=(EditText)findViewById(R.id.edit);

        //设置按钮监听事件

        but1.setOnClickListener(new Button.OnClickListener()

        {

                 @Override

                            public void onClick(View v) {

                                     Socket socket=null;//socket对象

                                     String mesg=edit1.getText().toString()+"\r\n";//组织要向服务器端发送的信息

                                     edit1.setText("");//文本框置空

                                     Log.e("dddd", "sent id");//输出日志信息

                                    

                                     try {

                                               socket=new Socket("192.168.1.32",54321);//新建一个socket

                                               //向服务器发送信息

                                               PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//新建输出流对象

                                               out.println(mesg);//把数据写入输出流

                                              

                                               //接受服务器的信息

                                               BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));//新建输入流对象

                                               String mstr=br.readLine();//按行读取数据(如果是多条数据,此处要加for循环)

                                               if(mstr!=null)//判断,如果从服务器端读取的信息不为空则更新组件

                                               {

                                                        text1.setText(mstr);

                                               }else

                                               {

                                                        text1.setText("数据错误");//错误提示

                                               }

                                               out.close();//关闭输出流

                                               br.close();//关闭输入流

                                               socket.close();//关闭socket

                                     } catch (UnknownHostException e) {

                                               e.printStackTrace();

                                     } catch (IOException e) {

                                               e.printStackTrace();

                                     }catch(Exception e)

                                     {

                                               Log.e(DEBUG_TAG,e.toString());//输出日志

                                     }

                            }               

        });

    }

}

下面是布局文件

<?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/edit"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" />

    <Button

        android:id="@+id/but1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="发送" />

    <TextView

        android:id="@+id/text1"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/hello" />
</LinearLayout>

客户内容就这么多,其实也不多,主要步骤都已经在代码注释中说明,此处就不再多说;下面看服务器端;

二、服务器端

         其实服务器端的内容非常简单,就是写一个类,开启一个线程,里面while(true)循环,检测客户端发来信息,并作出响应就可以了;一下是主要代码:

package server;

 

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

/**

 * 步骤:

 * 1、开启新线程,等待客户端信息

 * 2、新建监听客户端的socket对象

 * 3、新建输入、输出流

 * 4、读写信息

 * 5、关闭输入输出路

 * 6、关闭socket对象

 * */

 

public class AndroidServer implements Runnable{

         public void run() {

                   try {

                            ServerSocket serverSocket=new ServerSocket(54321);//建立ServerSocket对象

                            //一直循环监听客户端socket消息

                            while(true)

                            {

                                     System.out.println("等待接收用户连接:");

                                     //接受客户端请求

                                     Socket client=serverSocket.accept();//新建侦听并接受到此套接字的连接的socket对象。此方法在连接传入之前一直阻塞。

                                     try

                                     {

                                               //接受客户端信息

                                               BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));//新建读入流对象

                                               String str=in.readLine();//按行读取输入流读写

                                               System.out.println("read:  "+str);//输出输入流对象

                                               //向客户端发送消息

                                               PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);//新建输出流对象

                                               out.println("return  "+str);//将信息写入输出流对象

                                               in.close();//关闭输入流对象

                                               out.close();//关闭输出流对象

                                     }catch(Exception ex)

                                     {

                                               System.out.println(ex.getMessage());

                                               ex.printStackTrace();

                                     }

                                     finally

                                     {

                                               client.close();//关闭socket对象

                                               System.out.println("close");

                                     }

                            }

                   } catch (IOException e) {

                            System.out.println(e.getMessage());

                   }

         }

         //程序入口

         public static void main(String [] args)

         {

                   Thread desktopServerThread=new Thread(new AndroidServer());//新建线程

                   desktopServerThread.start();//启动线程

         }
}