В приведенных ниже кодах я пытаюсь позволить серверной стороне выбрать файл с клиента и отправить его, так что в основном вся работа выполняется на стороне сервера. программа работает, запустив сервер, чтобы дождаться, пока клиент запустится, сделайте соединение, затем сервер отправит место файла на стороне клиента outReader.write("B://ghassar/ghassar.txt");
клиент считывает местоположение и отправляет файл. Я запустил debug, и как только сервер прочитает этот код 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");
}
}
}
Я предлагаю вам использовать PrintWriter вместо BufferedWriter
. Не нужно вызывать флеш после каждой строки и просто использовать метод 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'
).