Задача: реализовать сервера и клиента для передачи файлов. Сервер отправляет файл клиенту по запросу. Сервер должен уметь обслуживать одновременно несколько клиентов.
В результате доконца отладить программу не получается самостоятельно, получаю ошибку "Socket is closed", требуется помощь, не понимаю почему сокет закрыт, я уже и вообще коментировал закрытие сокета и на сервере и клиенте. Такое ощущение, что он сам закрывается каким-то образом.
Сейчас сервер и клиент более-менее работают правильно, клиенты соединяются к серверу и забирают файлы. Если любой из клиент решит повторно забрать файл, то вываливается данная ошибка:
1.
2.
3.
4.
5.
Exception in thread "main" java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:903)
at client.Client.main(Client.java:38)
C:\Users\ok\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
СБОРКА ЗАВЕРШЕНА СО СБОЕМ (общее время: 1 минута 3 секунды)
Сервер
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(15123);
while (true) {
Socket socket = serverSocket.accept();
Runnable r = new ThreadedEchoHandler(socket);
Thread t = new Thread(r);
t.start();
}
}
}
class ThreadedEchoHandler implements Runnable {
Socket socket;
public ThreadedEchoHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
String FILE_NAME = "files/file1.txt";
File transferFile = new File(FILE_NAME);
try (FileInputStream in = new FileInputStream(transferFile);) {
OutputStream out = socket.getOutputStream();
int c = 0;
while ((c = in.read()) >= 0) {
out.write(c);
out.flush();
}
out.close();
in.close();
// s.close();
// socket.close();
System.out.println("File transfer complete");
} catch (IOException ex) {
Logger.getLogger(ThreadedEchoHandler.class.getName()).log(Level.SEVERE, null, ex);
}
finally{
if (socket != null) {
try {
socket.close();
} catch (IOException ex) {
Logger.getLogger(ThreadedEchoHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}
Клиент:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 15123);
System.out.println("Accepted connection : " + socket);
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
String FILE_NAME = "files/file1.txt";
while ((userInput = stdIn.readLine()) != null) {
if (userInput.toLowerCase().equals("exit")) {
break;
}
if (userInput.equals("1")) {
InputStream in = socket.getInputStream();
File copyFileName = new File(FILE_NAME);
FileOutputStream out = new FileOutputStream(copyFileName);
int c = 0;
while ((c = in.read()) >= 0) {
out.write((char) c);
}
out.close();
in.close();
// socket.close();
}
}
socket.close();
}
}