gpt4 book ai didi

java - Android如何复用Socket?

转载 作者:行者123 更新时间:2023-12-01 05:19:50 24 4
gpt4 key购买 nike

如何重用 TCP Socket 连接(可能 setReuseAddress(true),但对我不起作用)在连接中从服务器(Apache、HTTPD)下载多个文件而无需断开连接(并再次连接)。

下面是我的代码..

public class ClientThread implements Runnable {
public void run() {
try {

Log.d("ClientActivity", "C: Connecting...");
SocketAddress sockaddr = new InetSocketAddress(serverIpAddress, SERVERPORT);
socket = new Socket();

socket.setReuseAddress(true);
socket.setKeepAlive(true);
socket.setSoLinger(true, 3000);
socket.connect(sockaddr);

if (socket.isConnected()) {
DataInputStream input = new DataInputStream(socket.getInputStream());
PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

output.println("GET /way/images/profile/1231 HTTP/1.1");
output.println("Host: 192.168.1.2");
output.println("User-Agent: Java");
output.println("Accept: */*");
output.println("Connection: Keep-Alive");
output.println("");
output.flush();

String line;
File file = new File("/sdcard/aaa.png");
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fileOut = new FileOutputStream(file);
System.out.println("Getting first file");
while ( (line = input.readLine()) != null ) {
System.out.println(line);
fileOut.write(line.getBytes());
}
System.out.println("First file finished");
fileOut.flush();
fileOut.close();

output.println("GET /way/images/profile/1231 HTTP/1.1");
output.println("Host: 192.168.1.2");
output.println("User-Agent: Java");
output.println("Accept: */*");
output.println("Connection: Keep-Alive");
output.println("");
output.flush();

file = new File("/sdcard/aaa1.png");
if (!file.exists()) {
file.createNewFile();
}
fileOut = new FileOutputStream(file);
System.out.println("Getting second file");
while ( (line = input.readLine()) != null ) {
System.out.println(line);
fileOut.write(line.getBytes());
}
System.out.println("Second file finished");

fileOut.flush();
fileOut.close();
input.close();
output.close();

}
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}

finally {
try {
Log.d("ClientActivity", "Socket: Closed.");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

谢谢...

最佳答案

在绑定(bind)套接字之前设置ReuseAddress(true) 允许绑定(bind)套接字,即使先前的连接处于超时状态也是如此。

documentation of setReuseAddress

我认为直接使用套接字进行 HTTP 通信没有意义。我使用 HttpURLConnection。大多数情况下都可以正常工作。

关于java - Android如何复用Socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com