Я очень плохо знаком с программированием сокетов, андроид-студией и Java в целом, поэтому, пожалуйста, простите мою неопытность и путаницу в моем коде.Я также впервые задаю вопрос здесь.Первоначально я использовал DataOutputStream, как и для отправки изображения, но обратился к BufferedWriter для сервера, чтобы отправить ответ, так как функция readUTF, похоже, не работала, а переменная «resultfromServer» осталась «», хотя ответы, которые я виделотносительно того, что предложил AsyncTask, который я уже использую.Строки, использующие его, комментируются.Предполагается, что Клиент отправляет изображение на сервер и сервер на ПК, а сервер должен отправлять содержимое файла обратно в виде строки.Первоначально сервер должен был ждать несколько секунд, и клиент тоже должен был ждать, чтобы эмулировать обработку, но я прокомментировал эту часть для целей тестирования.Моя Java IDE - это Блокнот ++.Этот код является результатом многих онлайн-уроков, и я потратил несколько недель, пытаясь его отладить.В целях тестирования я перенес упрощенную форму клиентского кода на Java и запустил на компьютере клиент и сервер.Отправка изображений не обрабатывается.Вот этот код.
import java.util.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.net.*;
import javax.imageio.ImageIO;
import java.lang.*;
class myServerTry
{
public static void main(String[] args) throws InterruptedException{
ServerSocket serverSocket;
Socket socket;
DataInputStream dis;
int len;
String somestring="";
try {
serverSocket = new ServerSocket(9998);
System.out.println("waiting\n");
while( (true)){
socket = serverSocket.accept();
InputStream is=socket.getInputStream();
dis=new DataInputStream(is);
len= dis.readInt(); //originally the length of the data input stream.
System.out.println("Received integer: " +len);
//while(somestring==""){
//somestring= dis.readUTF();
//}
System.out.println(somestring);
//Thread.sleep(5000); //Read file
String filepath= "C:\\Users\\mahno\\Desktop\\BlankFile.txt";
FileInputStream fr=new FileInputStream(filepath); /* include your file name which you want to move*/
byte b[]=new byte[2002];
fr.read(b, 0, b.length);
//to show on console
String result ="";
for(int i=0; i<2002 && b[i]!=0; i++){
result +=(char) b[i];
}
System.out.println(result);
OutputStream os=socket.getOutputStream();
//DataOutputStream dos= new DataOutputStream(os);
//dos.writeUTF(result);
BufferedWriter writer= new BufferedWriter(new OutputStreamWriter(os));
writer.write(result);
os.close();
writer.close();
//close the socket
dis.readUTF();
fr.close();
is.close();
dis.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
Клиентская сторона.
import java.util.*;
import java.net.*;
import java.io.*;
public class SendImageClient {
public static void main(String args[]) throws Exception {
Socket socket=null;
String resultfromServer="";
OutputStream outputStream;
InputStream inputstream;
DataOutputStream dos;
DataInputStream dis;
try {
socket = new Socket("192.168.10.33", 9998);
outputStream = socket.getOutputStream();
dos = new DataOutputStream(outputStream);
inputstream = socket.getInputStream();
//dis = new DataInputStream(inputstream);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream));
try {
dos.writeInt(9);
dos.writeUTF("Some data is being sent\n");
outputStream.flush();
dos.flush();
//Thread.sleep(10000);
while((resultfromServer = reader.readLine())=null){
} //read and put it in a string
dos.writeUTF("\nOK");
System.out.println(resultfromServer);
//System.out.println(resultfromServer);
} catch (Exception e) {
e.printStackTrace();
} finally {
inputstream.close();
//dis.close();
reader.close();
outputStream.close();
dos.close();
}
} catch(Exception e){
}
socket.close();
}
}
Обе стороны генерируют исключения.Исключение на стороне клиента:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeUTF(Unknown Source)
at java.io.DataOutputStream.writeUTF(Unknown Source)
at SendImageClient.main(SendImageClient.java:36)
Исключение на стороне сервера:
java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at sun.nio.cs.StreamEncoder.implClose(Unknown Source)
at sun.nio.cs.StreamEncoder.close(Unknown Source)
at java.io.OutputStreamWriter.close(Unknown Source)
at java.io.BufferedWriter.close(Unknown Source)
at myServerTry.main(myServerTry.java:58)
Сторона сервера будет работать до тех пор, пока ей не придется что-то читать с клиента.