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
- 所谓Socket通常也称作"套接字",用于描述IP地址和端口,是一个同学连的句柄。
- 应用程序通常通过"套接字"向网络发送请求或者应答网络请求。
②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