Android客户端与PC服务器通过socket进行交互实例

2024-09-04 19:18

本文主要是介绍Android客户端与PC服务器通过socket进行交互实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android socket通信有点了解了。

下面是具体的代码,说明都在注释中了。需要注意的是,只有客户端发送了信息给服务器后,服务器才能响应客户端的输入,然后返回信息给客户端,这是客户端才能读取服务器返回的信息。如果客户端和服务器都处于等待对方的信息,那样就会造成阻塞,导致ANR了。

1.服务器端代码,就是一个java程序,与android无关,运行于服务器上,即PC机上。

[java] view plaincopy
  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  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. /** 
  12.  * 测试Android客户端与PC服务器通过socket进行交互 
  13.  * 服务器端:接收客户端的信息并回送给客户 
  14.  * @author Ameyume 
  15.  * 
  16.  */  
  17. public class Server implements Runnable {  
  18.     public static final String SERVERIP = "192.168.1.100";  
  19.     public static final int SERVERPORT = 51706;  
  20.   
  21.     public void run() {  
  22.         try {  
  23.             System.out.println("S: Connecting...");  
  24.   
  25.             ServerSocket serverSocket = new ServerSocket(SERVERPORT);  
  26.             while (true) {  
  27.                 // 等待接受客户端请求   
  28.                 Socket client = serverSocket.accept();  
  29.   
  30.                 System.out.println("S: Receiving...");  
  31.                   
  32.                 try {  
  33.                     // 接受客户端信息  
  34.                     BufferedReader in = new BufferedReader(  
  35.                             new InputStreamReader(client.getInputStream()));  
  36.                       
  37.                     // 发送给客户端的消息   
  38.                     PrintWriter out = new PrintWriter(new BufferedWriter(  
  39.                             new OutputStreamWriter(client.getOutputStream())),true);  
  40.                       
  41.                     System.out.println("S: 111111");  
  42.                     String str = in.readLine(); // 读取客户端的信息  
  43.                     System.out.println("S: 222222");  
  44.                     if (str != null ) {  
  45.                         // 设置返回信息,把从客户端接收的信息再返回给客户端  
  46.                         out.println("You sent to server message is:" + str);  
  47.                         out.flush();  
  48.                           
  49.                         // 把客户端发送的信息保存到文件中  
  50.                         File file = new File ("C://android.txt");  
  51.                         FileOutputStream fops = new FileOutputStream(file);   
  52.                         byte [] b = str.getBytes();  
  53.                         for ( int i = 0 ; i < b.length; i++ )  
  54.                         {  
  55.                             fops.write(b[i]);  
  56.                         }  
  57.                         System.out.println("S: Received: '" + str + "'");  
  58.                     } else {  
  59.                         System.out.println("Not receiver anything from client!");  
  60.                     }  
  61.                 } catch (Exception e) {  
  62.                     System.out.println("S: Error 1");  
  63.                     e.printStackTrace();  
  64.                 } finally {  
  65.                     client.close();  
  66.                     System.out.println("S: Done.");  
  67.                 }  
  68.             }  
  69.         } catch (Exception e) {  
  70.             System.out.println("S: Error 2");  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74.       
  75.     public static void main(String [] args ) {  
  76.         Thread desktopServerThread = new Thread(new Server());  
  77.         desktopServerThread.start();  
  78.   
  79.     }  
  80. }  
2.客户端程序,运行在手机或者模拟器上。
[java] view plaincopy
  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.InputStreamReader;  
  4. import java.io.OutputStreamWriter;  
  5. import java.io.PrintWriter;  
  6. import java.net.InetAddress;  
  7. import java.net.Socket;  
  8. import java.net.UnknownHostException;  
  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. /** 
  20.  * 测试Android客户端与PC服务器通过socket进行交互 
  21.  * 客户端:把用户输入的信息发送给服务器 
  22.  * @author Ameyume 
  23.  * 
  24.  */  
  25. public class Socket_Android extends Activity {  
  26.     private static final String TAG = "Socket_Android";  
  27.       
  28.     private EditText mEditText = null;  
  29.     private TextView tx1 = null;  
  30.     private Button mButton = null;  
  31.       
  32.     @Override  
  33.     public void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.main);  
  36.           
  37.         mButton = (Button)findViewById(R.id.Button01);  
  38.         mEditText = (EditText)findViewById(R.id.etSendMsg);  
  39.         tx1 = (TextView)findViewById(R.id.tx);  
  40.           
  41.         mButton.setOnClickListener(new OnClickListener() {  
  42.   
  43.             @Override  
  44.             public void onClick(View v) {  
  45.                 // TODO Auto-generated method stub  
  46.                 setTitle("测试Socket连接");  
  47.                 Socket socket = null;  
  48.                   
  49.                 try {  
  50.                     /* 指定Server的IP地址,此地址为局域网地址,如果是使用WIFI上网,则为PC机的WIFI IP地址 
  51.                      * 在ipconfig查看到的IP地址如下: 
  52.                      * Ethernet adapter 无线网络连接: 
  53.                      * Connection-specific DNS Suffix  . : IP Address. . . . . . . . . . . . : 192.168.1.100 
  54.                      */  
  55.                     InetAddress serverAddr = InetAddress.getByName("192.168.1.100");// TCPServer.SERVERIP  
  56.                     Log.d("TCP""C: Connecting...");  
  57.                       
  58.                     // 应用Server的IP和端口建立Socket对象  
  59.                     socket = new Socket(serverAddr, 51706);  
  60.                     String message = "---Test_Socket_Android---";    
  61.     
  62.                     Log.d("TCP""C: Sending: '" + message + "'");    
  63.                       
  64.                     // 将信息通过这个对象来发送给Server    
  65.                     PrintWriter out = new PrintWriter(new BufferedWriter(    
  66.                             new OutputStreamWriter(socket.getOutputStream())),    
  67.                             true);    
  68.                         
  69.                     // 把用户输入的内容发送给server  
  70.                     String toServer = mEditText.getText().toString();  
  71.                     Log.d(TAG, "To server:'" + toServer + "'");  
  72.                     out.println(toServer);  
  73.                     out.flush();    
  74.                       
  75.                       
  76.                     // 接收服务器信息    
  77.                     BufferedReader in = new BufferedReader(    
  78.                                 new InputStreamReader(socket.getInputStream()));    
  79.                     // 得到服务器信息    
  80.                     String msg = in.readLine();  
  81.                     Log.d(TAG, "From server:'" + msg + "'");  
  82.                     // 在页面上进行显示    
  83.                     tx1.setText(msg);    
  84.                 } catch(UnknownHostException e) {  
  85.                     Log.e(TAG, "192.168.1.100 is unkown server!");  
  86.                 } catch(Exception e) {  
  87.                     e.printStackTrace();  
  88.                 } finally {  
  89.                     try {  
  90.                         socket.close();  
  91.                     } catch(Exception e) {  
  92.                         e.printStackTrace();  
  93.                     }  
  94.                 }  
  95.             }  
  96.               
  97.         });  
  98.     }  
  99. }  
3.在客户端AndroidManifest.xml文件增加访问互联网的权限
[html] view plaincopy
  1. <uses-permission android:name="android.permission.INTERNET" />  

4.运行效果:


服务器接的log输出:

S: Receiving...
S: 111111
S: 222222
S: Received: 'hello'
S: Done.

本文参考自:Android通过socket连接服务器(PC)

这篇关于Android客户端与PC服务器通过socket进行交互实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136791

相关文章

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle