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();//启动线程 } } |
本问为自己在学习中的笔记,来自android交流群:190283084的共享资料,有现成的项目,自己加的注释,发表是主要用于个人复习所用,写得不对的地方请各位多多批评指正!