Android中的Socket编程的基本思路

来源:互联网 发布:淘宝查假冒伪劣处罚 编辑:程序博客网 时间:2024/06/06 04:50

学习了一段时间的android,今天回头看了看Android中的Socket编程,发觉其实Socket编程并不是很难,我把android中的Socket编程整理一下,给出我们一般Socket的步骤。

一、Socket编程分服务器端和客户端,首先,必须建立一个服务器端,以供客户端来连接。以下是建立服务器端程序的基本思路:

1、首先创建一个ServerSocket对象,并让这个ServerSocket在某一个端口号进行监听;

2、调用ServerSocket对象的accept()方法;

3、从Socket当中得到InputStream对象;

4、定义一个字节缓冲数组,用来存放客户端发送过来的数据;

5、从InputStream当中读取客户端发送过来的数据。

基本思路就如上所示,下面给出源码对照。

先给出布局:

<?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:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="@string/hello" />    <Button        android:id="@+id/startListener"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="启动监听线程" /></LinearLayout>


以下java的源代码:

package com.android.www;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class SocketDemo extends Activity {    /** Called when the activity is first created. */private Button startButton=null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        startButton=(Button)findViewById(R.id.startListener);        startButton.setOnClickListener(new Button.OnClickListener(){public void onClick(View v) {// TODO Auto-generated method stubnew ServerThread().start();}                });    }        class ServerThread extends Thread{    public void run(){    ServerSocket serverSocket=null;    try{    //1、创建一个ServerSocket对象,并让这个Socket在4567端口监听    serverSocket=new ServerSocket(6789);    //2、调用ServerSocket的accept()方法,接受客户端所发送的请求    Socket socket=serverSocket.accept();    //3、从Socket当中得到InputStream对象    InputStream inputStream=socket.getInputStream();    //4、定义一个字节缓冲数组,用来存放客户端发送过来的数据    byte buffer[]=new byte[1024*4];    int temp=0;    //5、从InputStream当中读取客户端发送过来的数据    while((temp=inputStream.read(buffer))!=-1){    System.out.println(new String(buffer,0,temp));    }    }catch(IOException e){    e.printStackTrace();    }     finally{    try{    serverSocket.close();    }catch(IOException e){    e.printStackTrace();    }    }    }    }}
为了能够使程序顺利运行,必须在AndroidManifest.xml文件中声明权限(绿色加粗部分)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.www"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk android:minSdkVersion="8" />
       <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
       <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
       <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
       <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".SocketDemo"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>


注意:以上程序必须在真实手机上才能够正确运行。

二、以下是建立客户端程序的基本思路:

客户端本人使用java编写,直接在电脑上运行就行,和我们一般运行j2SE的步骤一样。

1、创建一个Socket对象,指定服务器端的IP地址和端口号,和服务器端不同的是这里要给出服务器端的IP地址。因为服务器端是我们要交流的对象;

2、从Socket当中得到OutputStream;

3、定义一个字节缓冲数组buffer,用来储存我们将要发送的数据;

4、把字节缓冲数组的数据从OutputStream中发送出去。

package com.android.www;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;public class TCPClient {public static void main(String[] args) {// TODO Auto-generated method stubtry{//1、创建一个Socket对象,指定服务器端的IP地址和端口号//IP地址可以在命令行中使用IPConfig命令获得Socket socket=new Socket("192.168.159.10",6789);//在这里,我使用InputStream读取硬盘上的文件,可以进行发送文件InputStream inputStream=new FileInputStream("D://Android/Hello.txt");//2、从Socket当中得到OutputStreamOutputStream outputStream=socket.getOutputStream();//3、定义一个字节缓冲数组,用来储存从Hello.txt读取到的数据byte buffer[]=new byte[4*1024];int temp=0;//4、把字节缓冲数组的数据从OutputStream中发送出去while((temp=inputStream.read(buffer))!=-1){outputStream.write(buffer,0,temp);}outputStream.flush();}catch(Exception e){e.printStackTrace();}}}