首页 > 系统 > Android > 正文

Android编程之客户端通过socket与服务器通信的方法

2019-10-24 20:33:32
字体:
来源:转载
供稿:网友
这篇文章主要介绍了Android编程之客户端通过socket与服务器通信的方法,结合实例形式分析了Android基于socket通讯的具体步骤与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
 

本文实例讲述了Android编程之客户端通过socket与服务器通信的方法。分享给大家供大家参考,具体如下:

下面是一个demo,Android客户端通过socket与服务器通信。

由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI代码不一样。

Android客户端通过socket与服务器通信分为下面5步:

(1)通过IP地址和端口实例化Socket,请求连接服务器;

复制代码代码如下:
socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321

(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter
复制代码代码如下:
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);

这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。

 

(3)对Socket进行读写

复制代码代码如下:
out.println(message);

(4)关闭打开的流
复制代码代码如下:
out.close();

完整工程代码如下:
  1. package com.yarin.android.Examples_08_04;  
  2. import java.io.BufferedReader;  
  3. import java.io.BufferedWriter;  
  4. import java.io.InputStreamReader;  
  5. import java.io.OutputStreamWriter;  
  6. import java.io.PrintWriter;  
  7. import java.net.Socket;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. import android.widget.EditText;  
  15. import android.widget.TextView;  
  16. public class Activity01 extends Activity  
  17. {  
  18.   private final String    DEBUG_TAG  = "Activity01";  
  19.   private TextView  mTextView = null;  
  20.   private EditText  mEditText = null;  
  21.   private Button   mButton = null;  
  22.   /** Called when the activity is first created. */ 
  23.   @Override 
  24.   public void onCreate(Bundle savedInstanceState)  
  25.   {  
  26.     super.onCreate(savedInstanceState);  
  27.     setContentView(R.layout.main);  
  28.     mButton = (Button)findViewById(R.id.Button01);  
  29.     mTextView = (TextView)findViewById(R.id.TextView01);  
  30.     mEditText = (EditText)findViewById(R.id.EditText01);  
  31.     //登陆  
  32.     mButton.setOnClickListener(new OnClickListener()  
  33.     {  
  34.       public void onClick(View v)  
  35.       {  
  36.         Socket socket = null;  
  37.         String message = mEditText.getText().toString() + "/r/n";   
  38.         try 
  39.         {    
  40.           //创建Socket  
  41. //         socket = new Socket("192.168.1.110",54321);   
  42.           socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321  
  43.           //向服务器发送消息  
  44.           PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);     
  45.           out.println(message);   
  46.           //接收来自服务器的消息  
  47.           BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
  48.           String msg = br.readLine();   
  49.           if ( msg != null )  
  50.           {  
  51.             mTextView.setText(msg);  
  52.           }  
  53.           else 
  54.           {  
  55.             mTextView.setText("数据错误!");  
  56.           }  
  57.           //关闭流  
  58.           out.close();  
  59.           br.close();  
  60.           //关闭Socket  
  61.           socket.close();   
  62.         }  
  63.         catch (Exception e)   
  64.         {  
  65.           // TODO: handle exception  
  66.           Log.e(DEBUG_TAG, e.toString());  
  67.         }  
  68.       }  
  69.     });  
  70.   }  
?

布局文件main.xml
 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.   android:orientation="vertical" 
  4.   android:layout_width="fill_parent" 
  5.   android:layout_height="fill_parent" 
  6.   >  
  7.   <TextView 
  8.   android:id="@+id/TextView01" 
  9.   android:layout_width="fill_parent" 
  10.   android:layout_height="wrap_content" 
  11.   android:text="这里显示接收到服务器发来的信息" 
  12.   />  
  13.   <EditText 
  14.   android:id="@+id/EditText01" 
  15.   android:text="输入要发送的内容" 
  16.   android:layout_width="fill_parent" 
  17.   android:layout_height="wrap_content">  
  18.   </EditText>  
  19.   <Button 
  20.   android:id="@+id/Button01" 
  21.   android:layout_width="fill_parent" 
  22.   android:layout_height="wrap_content" 
  23.   android:text="发送" 
  24.   />   
  25. </LinearLayout> 
?

AndroidManifest.xml文件如下
 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.    package="com.yarin.android.Examples_08_04" 
  4.    android:versionCode="1" 
  5.    android:versionName="1.0">  
  6.   <application android:icon="@drawable/icon" android:label="@string/app_name"
  7.     <activity android:name=".Activity01" 
  8.          android:label="@string/app_name">  
  9.       <intent-filter>  
  10.         <action android:name="android.intent.action.MAIN" />  
  11.         <category android:name="android.intent.category.LAUNCHER" />  
  12.       </intent-filter>  
  13.     </activity>  
  14.   </application>  
  15.   <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  16.   <uses-sdk android:minSdkVersion="5" />  
  17. </manifest> 
?

当然,还有服务器端得代码
 

  1. package com.yarin.android.Examples_08_04;  
  2. import java.io.BufferedReader;  
  3. import java.io.BufferedWriter;  
  4. import java.io.InputStreamReader;  
  5. import java.io.OutputStreamWriter;  
  6. import java.io.PrintWriter;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9. public class Server implements Runnable  
  10. {  
  11.   public void run()  
  12.   {  
  13.     try 
  14.     {  
  15.       //创建ServerSocket  
  16.       ServerSocket serverSocket = new ServerSocket(54321);  
  17.       while (true)  
  18.       {  
  19.         //接受客户端请求  
  20.         Socket client = serverSocket.accept();  
  21.         System.out.println("accept");  
  22.         try 
  23.         {  
  24.           //接收客户端消息  
  25.           BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
  26.           String str = in.readLine();  
  27.           System.out.println("read:" + str);   
  28.           //向服务器发送消息  
  29.           PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);     
  30.           out.println("server message");   
  31.           //关闭流  
  32.           out.close();  
  33.           in.close();  
  34.         }  
  35.         catch (Exception e)  
  36.         {  
  37.           System.out.println(e.getMessage());  
  38.           e.printStackTrace();  
  39.         }  
  40.         finally 
  41.         {  
  42.           //关闭  
  43.           client.close();  
  44.           System.out.println("close");  
  45.         }  
  46.       }  
  47.     }  
  48.     catch (Exception e)  
  49.     {  
  50.       System.out.println(e.getMessage());  
  51.     }  
  52.   }  
  53.   //main函数,开启服务器  
  54.   public static void main(String a[])  
  55.   {  
  56.     Thread desktopServerThread = new Thread(new Server());  
  57.     desktopServerThread.start();  
  58.   }  
?

先开启服务器代码

java  Server即可

然后启动android模拟器。运行结果

这是Android客户端。输入12345,点击发送:

Android编程之客户端通过socket与服务器通信的方法

这是服务器端收到的消息

Android编程之客户端通过socket与服务器通信的方法

希望本文所述对大家Android程序设计有所帮助。



注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表