首页 > 系统 > Android > 正文

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

2020-04-11 11:15:28
字体:
来源:转载
供稿:网友

本文实例讲述了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();

完整工程代码如下:

package com.yarin.android.Examples_08_04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Activity01 extends Activity {   private final String    DEBUG_TAG  = "Activity01";   private TextView  mTextView = null;   private EditText  mEditText = null;   private Button   mButton = null;   /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState)   {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     mButton = (Button)findViewById(R.id.Button01);     mTextView = (TextView)findViewById(R.id.TextView01);     mEditText = (EditText)findViewById(R.id.EditText01);     //登陆     mButton.setOnClickListener(new OnClickListener()     {       public void onClick(View v)       {         Socket socket = null;         String message = mEditText.getText().toString() + "/r/n";          try          {             //创建Socket //         socket = new Socket("192.168.1.110",54321);            socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321           //向服务器发送消息           PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);              out.println(message);            //接收来自服务器的消息           BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));            String msg = br.readLine();            if ( msg != null )           {             mTextView.setText(msg);           }           else           {             mTextView.setText("数据错误!");           }           //关闭流           out.close();           br.close();           //关闭Socket           socket.close();          }         catch (Exception e)          {           // TODO: handle exception           Log.e(DEBUG_TAG, e.toString());         }       }     });   } }

布局文件main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   >   <TextView    android:id="@+id/TextView01"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="这里显示接收到服务器发来的信息"   />   <EditText    android:id="@+id/EditText01"    android:text="输入要发送的内容"    android:layout_width="fill_parent"    android:layout_height="wrap_content">   </EditText>   <Button    android:id="@+id/Button01"   android:layout_width="fill_parent"   android:layout_height="wrap_content"   android:text="发送"   />  </LinearLayout>

AndroidManifest.xml文件如下

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.yarin.android.Examples_08_04"    android:versionCode="1"    android:versionName="1.0">   <application android:icon="@drawable/icon" android:label="@string/app_name">    <activity android:name=".Activity01"          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>   <uses-permission android:name="android.permission.INTERNET"></uses-permission>   <uses-sdk android:minSdkVersion="5" /> </manifest>

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

package com.yarin.android.Examples_08_04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server implements Runnable {   public void run()   {     try     {       //创建ServerSocket       ServerSocket serverSocket = new ServerSocket(54321);       while (true)       {         //接受客户端请求         Socket client = serverSocket.accept();         System.out.println("accept");         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("server message");            //关闭流           out.close();           in.close();         }         catch (Exception e)         {           System.out.println(e.getMessage());           e.printStackTrace();         }         finally         {           //关闭           client.close();           System.out.println("close");         }       }     }     catch (Exception e)     {       System.out.println(e.getMessage());     }   }   //main函数,开启服务器   public static void main(String a[])   {     Thread desktopServerThread = new Thread(new Server());     desktopServerThread.start();   } }

先开启服务器代码

java  Server即可

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

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

这是服务器端收到的消息

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表