学习了一段时间的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 stub
new 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 stub
try{
//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当中得到OutputStream
OutputStream 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();
}
}
}