欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-10 13:30:46
本文实例讲述了android编程之客户端通过socket与服务器通信的方法。分享给大家供大家参考,具体如下: 下面是一个demo,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();

完整工程代码如下:
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编程之客户端通过socket与服务器通信的方法

这是服务器端收到的消息

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

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