Android socket通信教程:服务器与客户端实现

27 下载量 197 浏览量 更新于2023-05-04 2 收藏 61KB PDF 举报
"Android中通过Socket实现简单的通信流程,包括服务器和客户端的设置。" 在Android平台上,Socket通信是应用程序之间进行数据交换的一种方式。它允许设备间的双向通信,常用于移动应用与服务器或者设备之间的实时数据交互。下面将详细阐述如何在Android中实现Socket通信。 1. 添加网络访问权限 在AndroidManifest.xml文件中,必须添加INTERNET权限,以允许应用进行网络操作。这是通过在文件中包含以下XML代码实现的: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 没有这个权限,应用无法进行网络通信。 2. 创建服务器端 服务器端通常负责监听客户端的连接请求,并处理这些请求。以下是一个简单的Android服务器端实现: ```java import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Server { ServerSocket serverSocket = null; public final int port = 9998; public Server() { try { InetAddress addr = InetAddress.getLocalHost(); System.out.println("localhost: " + addr); serverSocket = new ServerSocket(port); System.out.println("Server started on port " + port); } catch (IOException e) { e.printStackTrace(); } } public void startService() { try { while (true) { Socket socket = serverSocket.accept(); // 阻塞,直到有客户端连接 System.out.println("Connected to " + socket.getInetAddress() + ":" + socket.getLocalPort()); new ConnectThread(socket).start(); // 创建新线程处理每个连接 } } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个例子中,服务器在指定的端口(9998)上监听,并且当有客户端连接时,会启动一个新的线程来处理该连接。 3. 创建客户端 客户端则需要连接到服务器,发送数据并接收响应。客户端的实现可能会在另一个Activity或Service中,如下所示: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { public void connectToServer(String ipAddress, int port) { try { Socket socket = new Socket(ipAddress, port); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello, Server!"); // 发送消息 String response = in.readLine(); // 读取服务器响应 System.out.println("Server responded: " + response); in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在客户端,我们创建一个Socket对象,连接到服务器,然后使用`PrintWriter`发送数据,并通过`BufferedReader`接收回应。 4. 线程安全和异常处理 在实际应用中,应确保服务器端的线程安全,避免并发连接处理中的数据冲突。同时,要正确处理所有可能的IOException,例如网络中断、超时或无法连接等。 5. 数据传输 在Socket通信中,数据通常是通过`DataInputStream`和`DataOutputStream`进行读写的。对于更复杂的数据结构,可能需要序列化和反序列化。例如,JSON或protobuf可以用来编码和解码数据,以便跨平台传输。 6. 关闭连接 当通信完成后,务必关闭Socket和相关的流,以释放系统资源。这通常在处理完每个连接的线程中完成。 总结起来,Android中的Socket通信涉及到创建服务器和客户端,设置网络权限,处理数据流以及管理连接。理解和掌握这些基础知识对于构建需要实时通信功能的应用至关重要。