开发者社区> 聚优云惠> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Android socket服务器通信

简介: 下面是一个demo,Android客户端通过socket与服务器通信。  由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。
+关注继续查看

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

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

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

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

 

[java] view plaincopy
  1. socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321  

(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter

[java] view plaincopy
  1. PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);     

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

(3)对Socket进行读写

[java] view plaincopy
  1. out.println(message);  

 

(4)关闭打开的流

[java] view plaincopy
  1. out.close();  

完整工程代码如下:

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

布局文件main.xml

[java] view plaincopy
  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文件如下

[java] view plaincopy
  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>   

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

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

先开启服务器代码,

java  Server即可

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

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

TCP_CLIENT

 

 

这是服务器端收到的消息

tcp_server


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android通过Socket与服务器进行通信
终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~   先上代码,可以先把代码下下来,对着代码看本文。代码地址是:https://github.com/huangtianyu/SocketDemo,代码记得点击star哦~   总有些想尝试一些底层的人,之前做过socket开发,总是想能不能用socket实现手机和服务器直接通信。
1385 0
Android开发之Activity转场动画
引子 相信开发过iOS的程序员都知道iOS ViewController之间的跳转动画非常多,很酷对不对?这让开发Android的羡慕不已,曾几何时,Android中的Activity跳转是何等的生硬,But,在Android 5.0以后,Google也为Activity的转场设计了更加友好的动画效果。
765 0
+关注
聚优云惠
专业科普建站知识 ,让建站变得更简单。专注于WordPress和Java建站知识讲解,云服务器主机知识讲解,建站程序搭建和网站优化。 欢迎访问我的网站 :http://tencent.yundashi168.com
377
文章
310
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载