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

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动