到目前为止,我一直按照书本做所有事情,并且总是遇到这种例外,所以我真的需要一些建议。我正在尝试使用我的家庭 WiFi 实现客户端-服务器对。
与我的 ISP 有什么关系吗? Android Manifest 已经有
INTERNET
和 ACCESS_NETWORK_STATE
(甚至还有 MANAGE_EXTERNAL...
,尽管不直接相关)。
Java 服务器:
try {
FileInputStream fIS = new FileInputStream(file);
fIS.read(array, 0, array.length);
Socket client = serverSocket.accept();
if (!(client.getInetAddress().getHostAddress().equals("192.168.1.2"))) client.close();
System.out.println(client.getInetAddress().getHostAddress() + " HAS CONNECTED, PORT "
+ client.getPort());
if (client.isOutputShutdown()) {
System.out.println("CLIENT SOCKET HAS BEEN SHUT!!!!!!");
return;
}
OutputStream clientOut = client.getOutputStream();
System.out.println("SENDING FILE CHUNKS...");
System.out.println("0000000000000000");
clientOut.write(array, 0, array.length);
clientOut.flush();
System.out.println("111111111111111111");
client.close();
System.out.println("333333333333333333");
System.out.println("FINISHED!");
}
catch(SocketException se){
System.err.println(se.getMessage());
se.printStackTrace();
}
catch(FileNotFoundException ex){
System.err.println(ex.getMessage());
}
catch(IOException ex){
System.err.println(ex.getMessage());
}
安卓客户端:
try {
clientSocket = new Socket("192.168.1.4",65001,thisLocalAddr,64999);
clientSocket.setSoTimeout(15000);
array = new byte[13574867];
InputStream realIS = clientSocket.getInputStream();
if (clientSocket.isInputShutdown()) return;
realIS.read(array,0,array.length);
fiOS = new FileOutputStream(Environment.getExternalStorageDirectory() +
"/Share/file.pdf");
fiOS.write(array,0, array.length);
realIS.close();
clientSocket.close();
fiOS.close();
}
catch (SocketException se) {
Log.e("MainActivity ", se.getStackTrace().toString());
}
catch (NumberFormatException nfn) {
Log.d("MainActivity", nfn.getStackTrace().toString());}
catch (UnknownHostException uhe) {
Log.d("MainActivity", "Unknown Host Exception");
Log.d("FileReceiver: ","dumbo = " + dumbo.length()) ;
}
控制台结果:
192.168.1.2 HAS CONNECTED, PORT 64999
SENDING FILE CHUNKS...
0000000000000000
Connection reset by peer
java.net.SocketException: Connection reset by peer
at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method)
at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:54)
at java.base/sun.nio.ch.NioSocketImpl.tryWrite(NioSocketImpl.java:394)
at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:410)
at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440)
at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:819)
at java.base/java.net.Socket$SocketOutputStream.implWrite(Socket.java:1223)
at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1210)
at Main.sendFile(Main.java:53)
at Main.main(Main.java:15)
您的客户端仅读取 1 块数据,然后关闭连接。下次服务器尝试写入连接时,它会失败。客户需要继续阅读,直到没有更多内容可读为止。处理这个问题的最佳方法是让服务器在发送文件数据之前发送文件大小,这样客户端就可以知道需要多少数据。