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();//启动线程
}
}