20212413 2023-2024-2 《移动平台开发与实践》第4次作业

本文讲述了作者在《移动平台开发与实践》课程中关于AndroidSocket编程的实验经历,包括网络API接口、B/S和C/S架构、服务器与客户端通信方式,以及在实验中遇到的问题和解决方案,强调了Socket编程在Android中的重要性和实践过程中的学习体验。
摘要由CSDN通过智能技术生成

20212413 2023-2024-2 《移动平台开发与实践》第4次作业

1.实验内容

在这个星期,我系统学习了 Android Soket 相关知识:

①Android系统网络相关API接口

  • java.net.*(标准Java接口)。
  • Org.apache接口。
  • Android.net.*(Android网络接口)。

②网络架构主要有两种模式B/S、C/S:

  • B/S:就是浏览器/服务器端模式,通过应用层的HTTP协议通信,不需要特定客服端软件,而是需要统一规范的客户端,简而言之就是Android网络浏览器(如chrome,QQ浏览器等)访问web服务器端的方式。
  • C/S:就是客户端/服务器端模式,通过任意的网络协议通信,需要特定的客户端软件。

③服务器返回客户端的内容有三种方式:

  • 以HTML代码的形式返回。
  • 以XML字符串的形式返回,做Android开发是这种方式比较多。返回的数据需要通过XML解析(SAX、DOM、PULL等)器进行解析(必备知识)。
  • 以json对象的方式返回。

2.实验介绍

Android 网络编程——基于socket通信

①什么是Socket
  1. 所谓Socket通常也称作"套接字",用于描述IP地址和端口,是一个同学连的句柄。
  2. 应用程序通常通过"套接字"向网络发送请求或者应答网络请求。
②Socket基本通信模型

在这里插入图片描述
Socket通信主要分为服务端和客服端。

③使用基于TCP协议的Socket

在这里插入图片描述

④使用UDP的Socket

(1)、创建DatagramPacket

DatagramSocket(byte[] data, int offset, int length, InetAddress remoteAddr, int remotePort);

该构造函数创建一个数据报文对象,数据包含在第一个参数中。

(2)、创建DatagramSocket

DatagramSocket(int localPort);

该构造函数将创建一个UDP套接字。

(3)、DatagramSocket:发送和接收

void send(DatagramPacket packet);

此方法用来发送DatagramPacket实例,一旦创建连接,数据报将发送到该套接字所连接的地址

void receive(DatagramPacket packet);

此方法将阻塞等待,直到接收到数据报文,并将报文中的数据复制到指定的DatagramPacket实例中

3.实验过程

1.权限设置:

 <uses-permission android:name="android.permission.INTERNET"/>

2.服务器端核心代码:

   /**  
    * 从参数的Socket里获取消息 
    */  
   private static void startReader(final Socket mSocket) {  
       new Thread(){  
           @Override  
           public void run() {  
               try {  
                   // 获取读取流  
                   BufferedReader in = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),"utf-8"))
				   String line="";
				   while ((line = in.readLine()) != null) {// 读取数据  
                       System.out.println("*等待客户端输入*");  
                       System.out.println("获取到客户端的信息:" + line);
				    }
               } catch (IOException e) {  
                   e.printStackTrace();  
               }  
           }  
       }.start();  
   } 

 //通过socket来给客户端发送消息
 private void serverSendMessage(String mServerSendMessage) {
     new Thread() {
         @Override
         public void run() {
             PrintWriter out;
             try {
                 out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())), true);
                 out.println(mServerSendMessage);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }.start();
  }

3.客户端核心代码:

//与服务器建立连接
Socket mClientSocket = new Socket(mClientIp, mClientPort);

//从socket获取输入输出流
BufferedReader mClientIn = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
PrintWriter mClientOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mClientSocket.getOutputStream())), true);

//监听服务端下发的消息
String clientReceiverMessage;
if ((clientReceiverMessage = mClientIn.readLine()) != null) {
	if (mOnConnectListener != null) {
		mOnConnectListener.onMessage(clientReceiverMessage);
	}
} 

最后结果:
在这里插入图片描述

4.实验中遇到的问题及解决

  • 问题1:命令提示符无法查找IP地址。

  • 问题1解决方案:在C盘目录下输入cmd进入命令提示符,接着输入 cd windows 和 cd system32 ,之后就可以输入ipconfig查找IP地址了。
    详细请点击此链接

  • 问题2:Android Studio 中客户端无法与服务器端连接。

  • 问题2解决方案:首先查看IP地址是否填错,再看端口号是否一致,最后再看是否处于同一局域网下。

5.学习感悟、思考等)

通过这次实验,我深入学习了Android平台上Socket编程的基本概念,并实践了使用Kotlin语言实现Android Socket服务端和客户端的过程。

在实验初期,我首先明确了实验目的,即掌握Socket编程在Android平台上的应用,学习Kotlin语言的编程技巧,以及理解TCP/UDP协议在Socket通信中的作用。

在实验过程中,我首先实现了服务端。我创建了一个新的Android项目,并在项目中添加了INTERNET权限,以便应用能够访问网络。接着,我编写了服务端代码,通过创建ServerSocket来监听指定端口。这一过程中,我深刻体会到了网络编程的复杂性和严谨性,需要考虑到各种异常情况的处理。

随后,我实现了客户端。我编写了客户端代码,通过创建Socket对象来连接服务端。在客户端的实现过程中,我更加深入地理解了Socket通信的原理,以及TCP/UDP协议在其中的应用。

在实验的最后阶段,我进行了运行和测试。我启动了服务端,并在后台线程中调用acceptClients()方法监听客户端连接。然后启动客户端,连接了服务端,并使用sendData()方法发送了数据。看到客户端发送的数据成功被服务端接收并处理。

通过这次实验,我不仅掌握了Android平台上Socket编程的基本概念,还提高了自己的编程能力。我深刻认识到,网络编程是一个需要严谨思维和细致操作的领域,每一个细节都可能影响到整个系统的稳定性和安全性。

参考资料

  • https://blog.csdn.net/Hunter2916/article/details/129628721
  • https://blog.csdn.net/m0_54852350/article/details/124511885?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-124511885-blog-129628721.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-124511885-blog-129628721.235%5Ev43%5Epc_blog_bottom_relevance_base1&utm_relevant_index=5
  • https://blog.csdn.net/weixin_41259437/article/details/104163547
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值