Отправляет файлы с клиента на сервер
В приведенных ниже кодах я пытаюсь разрешить стороне сервера выбирать файл на клиенте и отправлять его, поэтому в основном вся работа выполняется на стороне сервера. программа работает, запустив сервер, сначала дождитесь запуска клиента, установите соединение, затем сервер отправит место файла клиентской стороне outReader.write("B://ghassar/ghassar.txt");
клиент читает местоположение и отправляет файл. Я запустил отладку, и когда сервер читает этот код String filename = inReader.readLine();
он останавливается и входит как петля, может кто-нибудь помочь мне решить проблему
/ Server.java
/*
* Server waits for a connection to be established by client
*
*/
import java.io.*;
import java.net.*;
class Server
{
public static void main(String args[])throws Exception
{
System.out.println("Server running...");
/* Listen on port 5555 */
ServerSocket server = new ServerSocket(222);
/* Accept the sk */
Socket sk = server.accept();
System.out.println("Server accepted client");
// to recive from client
InputStream input = sk.getInputStream();
//read what is coming
BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));
//write to client
BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
outReader.write("B://ghassar/ghassar.txt");
outReader.flush();
/* Read the filename */
String filename = inReader.readLine();
if (filename.equals("ghassar.txt") ){
/* Reply back to client with READY status */
outReader.write("READY\n");
outReader.flush();
}
/* Create a new file in the libya directory using the filename */
FileOutputStream wr = new FileOutputStream(new File("B://libya/ "+ filename));
byte[] buffer = new byte[sk.getReceiveBufferSize()];
int bytesReceived = 0;
while((bytesReceived = input.read(buffer))>0)
{
/* Write to the file */
wr.write(buffer,0,bytesReceived);
}
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Client {
public static void main(String args[]){
Client clientForm = new Client();
clientForm.action();
}
public void action() {
try{
/* Try to connect to the server on localhost, port 5555 */
Socket sk = new Socket("localhost", 222);
OutputStream output = sk.getOutputStream();
/* the steam to send the staff*/
OutputStreamWriter outputStream = new OutputStreamWriter(sk.getOutputStream());
/* steam to recive staff */
BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String serverStatus = inReader.readLine(); // Read the first line
String filename = serverStatus;//fileDlg.getSelectedFile().getAbsolutePath();
outputStream.write("ghassar.txt");
outputStream.flush();
/* If server is ready, send the file */
if ( serverStatus.equals("READY") ){
FileInputStream file = new FileInputStream(filename);
byte[] buffer = new byte[sk.getSendBufferSize()];
int bytesRead = 0;
while((bytesRead = file.read(buffer))>0)
{
output.write(buffer,0,bytesRead);
}
output.close();
file.close();
sk.close();
System.out.println("File sent");
}
}
catch (Exception ex){
/* Catch any errors */
System.out.println("not File sent");
}
}
}
1 ответ
Я предлагаю вам использовать PrintWriter вместо BufferedWriter
, Нет необходимости вызывать flush после каждой строки и просто использовать println()
метод наряду с функцией автоматической очистки, чтобы добавить новую строку, а также.
В отличие от класса PrintStream, если включена автоматическая очистка, это будет сделано только тогда, когда один из
println
,printf
, или жеformat
методы вызываются, а не всякий раз, когда появляется символ новой строки.Эти методы используют собственное представление платформы о разделителе строк, а не символ новой строки.
Нет необходимости добавлять \n
в самом сообщении.
Образец кода:
// here true means auto flush when `println()` method is called
PrintWriter w=new PrintWriter(new OutputStreamWriter(sk.getOutputStream()),true);
w.println(message);
Возможная причина в коде:
Проблема может быть в следующих строках, где \n
не добавляется в конец строки в write()
метод перед промывкой и на стороне клиента метод readLine()
используется, чтобы прочитать это.
BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
outReader.write("B://ghassar/ghassar.txt");
outReader.flush();
Примечание: вы можете использовать BufferedWriter#newLine() вместо \n
который пишет разделитель строк. Строка разделителя строк определяется системным свойством line.separator и не обязательно является одной новой строкой ('\n'
) персонаж.