#java
#Ява
Вопрос:
Я работаю над проектом, чтобы узнать, как создать приложение для обмена групповыми сообщениями, я посмотрел учебник и сделал его. Однако я не могу передавать файлы, я получаю SocketException
ошибку, а затем множество ошибок закрытия потока. Вот мой код:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { Socket socket; private ServerSocket serverSocket; public Server (ServerSocket serverSocket){ this.serverSocket = serverSocket; } public void startServer () { try { while(!serverSocket.isClosed()){ socket = serverSocket.accept(); System.out.println("A new client has arrived"); ClientHandler clientHandler = new ClientHandler(socket); Thread thread = new Thread (clientHandler); thread.start(); FileInputStream newInputStream = new FileInputStream(""C:\Users\abdul\Documents\Greedy.pptx""); byte newByte [] = new byte [10000]; newInputStream.read(newByte, 0, newByte.length); OutputStream newOutputStream = socket.getOutputStream(); newOutputStream.write(newByte, 0, newByte.length); } } catch (IOException e) { } } public void closeServerSocket () { try { if (serverSocket != null){ serverSocket.close(); } } catch (IOException e){ e.printStackTrace(); } } public static void main (String [] args) throws IOException { ServerSocket serverSocket = new ServerSocket (1234); Server server = new Server (serverSocket); server.startServer(); } } import java.io.*; import java.net.*; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; public class ClientHandler implements Runnable { public static ArrayList lt;ClientHandlergt; clientHandlers = new ArrayList lt;gt; (); private Socket socket; private BufferedReader bufferedReader; private BufferedWriter bufferedWriter; private String username; public ClientHandler (Socket socket) { try { this.socket = socket; this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); this.username = bufferedReader.readLine(); clientHandlers.add(this); broadcastMessage("SERVER: " username " has entered the chat"); } catch (IOException e) { closeEverything(socket, bufferedReader, bufferedWriter); } } @Override public void run () { String messageFromClient; while(socket.isConnected()){ try { messageFromClient = bufferedReader.readLine(); broadcastMessage(messageFromClient); } catch (IOException e){ closeEverything(socket, bufferedReader, bufferedWriter); break; } } } public void broadcastMessage (String messageToSend){ for(ClientHandler clientHandler : clientHandlers){ try { if(!clientHandler.username.equals(username)){ clientHandler.bufferedWriter.write(messageToSend); clientHandler.bufferedWriter.newLine(); clientHandler.bufferedWriter.flush(); } } catch (IOException e) { closeEverything(socket, bufferedReader, bufferedWriter); } } } public void closeEverything (Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter){ clientHandlers.remove(this); try { if (socket != null){ socket.close(); } if (bufferedReader != null){ bufferedReader.close(); } if (bufferedWriter != null){ bufferedWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } import java.io.*; import java.net.*; import java.util.* public class Client { private Socket socket; private BufferedReader bufferedReader; private BufferedWriter bufferedWriter; private String username; public Client (Socket socket, String username) { try { this.socket = socket; this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); this.username = username; } catch (IOException e) { closeEverything(socket, bufferedReader, bufferedWriter); } } public void sendMessage () { try { bufferedWriter.write(username); bufferedWriter.newLine(); bufferedWriter.flush(); Scanner keyboard = new Scanner (System.in); while (socket.isConnected()) { String messageToSend = keyboard.nextLine(); if(messageToSend.equals("F")){ byte newByte [] = new byte [10000]; InputStream newInputStream = socket.getInputStream(); FileOutputStream newOutputStream = new FileOutputStream(""C:\Users\abdul\Documents\Greedy2.pptx""); newInputStream.read(newByte, 0, newByte.length); newOutputStream.write(newByte, 0, newByte.length); } else { bufferedWriter.write(username ": " messageToSend); bufferedWriter.newLine(); bufferedWriter.flush(); } } } catch (IOException e) { closeEverything(socket, bufferedReader, bufferedWriter); } } public void listenForMessage () { new Thread (new Runnable(){ @Override public void run () { String msgFromGroupChat; while(socket.isConnected()) { try { msgFromGroupChat = bufferedReader.readLine(); System.out.println(msgFromGroupChat); } catch (IOException e){ e.printStackTrace(); } } } }).start(); } public void closeEverything (Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter){ try { if (socket != null){ socket.close(); } if (bufferedReader != null){ bufferedReader.close(); } if (bufferedWriter != null){ bufferedWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } public static void main (String [] args) throws IOException { Scanner scanner = new Scanner(System.in); System.out.println("Enter your username for the group chat: "); String username = scanner.nextLine(); Socket socket = new Socket ("localhost", 1234); Client client = new Client(socket, username); client.listenForMessage(); client.sendMessage(); } }
Я добавил FileInputStream
, FileOutputStream
сам в startServer
и sendMessage
. Этого не было в оригинальном учебнике. Это мой первый раз