我是Java的新手,在将变量从一个类传递到另一个主类时遇到了一些问题。
关于该计划的一点 -
我有一个名为" Server.java"另一个名为" Client.java"
这是一个用java编写的简单TCP服务器客户端程序。首先执行服务器类,以便它可以接受来自客户端的连接,该连接是第二次执行的。
一旦客户端连接到服务器,客户端通过键入,例如" alice.txt"来指定它希望从服务器接收的文件的名称。然后服务器将具有该名称的文件发送到客户端。
我被困的地方 -
如果我首先在服务器中硬编码文件的名称,我只能在客户端接收文件(请查看下面的代码)。我希望从客户端获取文件名并传递给Server类,以便代码适用于所有文件,而不仅仅是一个硬编码的文件。
感谢任何帮助:)
Server.java
import java.io.*;
import java.net.*;
class Server
{
public static void main(String argv[]) throws Exception
{
//beginning of the try method
try
{
//create a new serversocket object with port no 6789
ServerSocket welcomeSocket = new ServerSocket(6789);
//while loop
while(true)
{
//create a new socket object and accept the connection and it waits for any connection from client
Socket connectionSocket = welcomeSocket.accept();
//display confirmation to the user
System.out.println("Connection accepted!");
System.out.println("File request recevied!");
//specify the file the server wants to send
File myFile = new File("alice.txt");
//THIS IS WHERE THE FILE FROM THE CLIENT IS HARD-CODED. I AM TRYING TO REPLACE THE FILE NAME WITH A VARIABLE THAT WAS PASSED FROM THE CLIENT SIDE
//get the byte array length of the file
byte [] bArray = new byte [(int)myFile.length()];
//open a new file object
FileInputStream f = new FileInputStream(myFile);
//new buffered input stream object
BufferedInputStream bs = new BufferedInputStream(f);
//read function of the inputput stream
bs.read(bArray, 0, bArray.length);
//declare new output strea object
OutputStream os = connectionSocket.getOutputStream();
//display messages to the users
System.out.println("Okay, sending the file now.");
//write the file
os.write(bArray, 0, bArray.length);
//flush the file
os.flush();
//close the connection
connectionSocket.close();
//display confirmation message to the user
System.out.println("File was successfully sent!");
}
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
Client.java
import java.io.*;
import java.net.*;
import java.util.*;
class Client
{
public static void main(String argv[]) throws Exception
{
try
{
//declare scanner object
Scanner s = new Scanner(System.in);
//display a message to the user
System.out.println("Enter the file name you wish to request");
//read the user input
String textFileName = s.nextLine();
//declare a new Socket object and specify the host name and the port number
Socket clientSocket = new Socket("localhost", 6789);
//make a byte array in which the transmitted file will be broken down into and sent
byte [] bArray = new byte[10000000];
//create new inputstream object and set it to the input stream from the client
InputStream is = clientSocket.getInputStream();
//open new fileinput object
FileOutputStream fos = new FileOutputStream(textFileName);
//get the value from the fileoutputstream to bufferedoutput stream
BufferedOutputStream bos = new BufferedOutputStream(fos);
//read function of the inputsteam object
int readFile = is.read(bArray,0,bArray.length);
//assign readfile to endile
int endFile = readFile;
do
{
readFile = is.read(bArray, endFile, (bArray.length-endFile));
if(readFile >= 0)
{
endFile = endFile + readFile;
}
}while(readFile > -1);
//write file
bos.write(bArray, 0, endFile);
//show the message to the user
System.out.println("File " + textFileName + " was successfully received!");
//flush the file
bos.flush();
//close the file
bos.close();
//close the socket
clientSocket.close();
///
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
答案 0 :(得分:0)
根据您的代码,一旦建立连接,客户端期望使用InputStream从服务器获取某些内容,并使用OutputStream将服务器发送到客户端。但是你必须这样做,一旦建立了连接,在客户端代码中,使用OutputStream将文件名写入服务器,然后从服务器读取数据,类似地,在服务器端首先从客户端读取内容然后像你一样向客户端写入内容。
答案 1 :(得分:0)
我该怎么做:
PS:这还没有经过测试,但原理就在这里..
Server.java
import java.io.*;
import java.net.*;
class Server
{
public static void main(String argv[]) throws Exception
{
//beginning of the try method
try
{
//create a new serversocket object with port no 6789
ServerSocket welcomeSocket = new ServerSocket(6789);
//while loop
while(true)
{
//create a new socket object and accept the connection and it waits for any connection from client
Socket connectionSocket = welcomeSocket.accept();// TODO - Make a new thread after the connection is accepted
//display confirmation to the user
System.out.println("Connection accepted!");
// Recover the fileName from client
String fileName = "";
InputStream iS = connectionSocket.getInputStream();
InputStreamReader iSR = new InputStreamReader(iS);
BufferedReader bR = new BufferedReader(iSR);
fileName = bR.readLine();
System.out.println("File request received : " + fileName);
// Recover the file's byte array
File myFile = new File(fileName);
byte[] bArray = new byte[(int)myFile.length()];
FileInputStream f = new FileInputStream(myFile);
BufferedInputStream bs = new BufferedInputStream(f);
bs.read(bArray, 0, bArray.length);
//display messages to the users
System.out.println("Okay, sending the file now.");
//declare new output strea object
OutputStream os = connectionSocket.getOutputStream();
os.write(bArray, 0, bArray.length);
os.flush();
//close the connection
connectionSocket.close();
//display confirmation message to the user
System.out.println("File was successfully sent!");
}
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
Client.java
import java.io.*;
import java.net.*;
import java.util.*;
class Client
{
public static void main(String argv[]) throws Exception
{
try
{
//declare scanner object
Scanner s = new Scanner(System.in);
//display a message to the user
System.out.println("Enter the file name you wish to request");
//read the user input
String textFileName = s.nextLine();
//declare a new Socket object and specify the host name and the port number
Socket clientSocket = new Socket("localhost", 6789);
// Send the filename via the connection
OutputStream oS = clientSocket.getOutputStream();
BufferedWriter bW = new BufferedWriter(new OutputStreamWriter(oS));
bW.write(textFileName);
//make a byte array in which the transmitted file will be broken down into and sent
byte[] bArray = new byte[10000000];
//create new inputstream object and set it to the input stream from the client
InputStream is = clientSocket.getInputStream();
//open new fileinput object
FileOutputStream fos = new FileOutputStream(split[1]);
//get the value from the fileoutputstream to bufferedoutput stream
BufferedOutputStream bos = new BufferedOutputStream(fos);
//read function of the inputsteam object
int readFile = is.read(bArray,0,bArray.length);
//assign readfile to endile
int endFile = readFile;
do
{
readFile = is.read(bArray, endFile, (bArray.length-endFile));
if(readFile >= 0)
{
endFile = endFile + readFile;
}
}while(readFile > -1);
//write file
bos.write(bArray, 0, endFile);
//show the message to the user
System.out.println("File " + textFileName + " was successfully received!");
//flush the file
bos.flush();
//close the file
bos.close();
//close the socket
clientSocket.close();
///
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}