目录
1 基于TCP的网络通信
1.1 TCP基础
TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输层通信协议。这意味着在数据传输之前,需要先在两个通信实体之间建立一个连接。
1.2 使用Socket进行通信
在 Android 中,可以创建一个 TCP 客户端,连接到服务器,使用 Socket 对象与服务器进行通信。一个简单的创建 Socket 和发送数据到服务器的示例如下:
// 注意:网络操作应在非主线程中进行,这里只是简单示例
new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建 Socket
Socket socket = new Socket("www.example.com", 80);
// 获取输出流
OutputStream os = socket.getOutputStream();
// 写入数据
os.write("Hello World".getBytes());
os.flush();
socket.shutdownOutput(); //关闭输出流
// 关闭 Socket
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
1.3 加入多线程
为了防止阻塞 UI 线程,网络通信的代码应该在工作线程中运行。以上的代码就是在新的线程中执行的。
2 使用URI访问网络资源
2.1 使用URL读取网络资源
可以使用 java.net.URL
类来读取网络资源,例如:
new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建URL对象
URL url = new URL("https://www.example.com");
// 打开连接并获取输入流
InputStream in = url.openStream();
int data = in.read();
while (data != -1) {
// 读取并处理数据
data = in.read();
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
2.2 使用URL Connection提交请求
可以使用 java.net.HttpURLConnection
类来发送 HTTP 请求,例如:
new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建URL对象
URL url = new URL("https://www.example.com");
// 打开连接并获取HttpURLConnection对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方式
conn.setRequestMethod("GET");
// 获取并处理响应码
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 请求成功,读取并处理响应数据
}
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
3 使用HTTP访问网络
除了使用 HttpURLConnection,你还可以使用更强大的第三方库,如 OkHttp,它提供了更简洁和高效的 API 来发送 HTTP 请求,例如:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.example.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
// 请求成功,读取并处理响应数据
}
}
});
4 使用Web Service进行网络编程
Web Service 是一种服务端应用程序,客户端可以通过 HTTP 或者 SOAP 等协议进行交互。你可以使用 SOAP 或 RESTful 接口调用 Web Service,但具体的代码实现取决于你的 Web Service 接口和你选择的库。
对于 Web Service,其主要有两种常用的实现形式:SOAP 和 RESTful。在 Android 中调用它们需要使用到一些库,因为 Android 平台没有提供官方的 SOAP 支持。
4.1 使用SOAP协议的Web Service
SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于交换网络中的信息。在 Android 中,可以使用 kSOAP2 这个开源库来访问 SOAP Web Service。
以下是一个基础的代码示例:
new Thread(new Runnable() {
@Override
public void run() {
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// 如果方法有参数,那么添加参数
request.addProperty("paramKey", "paramValue");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE(SERVICE_URL);
httpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject) envelope.bodyIn;
// 在主线程更新 UI
runOnUiThread(new Runnable() {
@Override
public void run() {
// 处理返回的数据
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
注意,SOAP Web Service 的调用需要网络操作,应该在新的线程中进行。
4.2 使用RESTful接口的Web Service
RESTful 是一种常用的 Web Service 设计风格,你可以使用任何能发送 HTTP 请求的库来调用 RESTful 接口,如 HttpUrlConnection 或者 OkHttp。
以下是一个使用 OkHttp 的例子:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com/users/1")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
// 你可以在这里处理返回的数据
String responseData = response.body().string();
}
}
});
上述代码会发送一个 GET 请求到指定的 URL,并异步接收返回的数据。
这两个例子都是基础的用法,实际使用时可能需要添加更多的功能,如设置请求头,处理不同的 HTTP 状态码等。同时,网络请求可能会出现各种问题,所以实际的代码需要进行更多的错误处理。