TCP服务器和客户端java

时间:2014-05-19 12:15:58

标签: java networking tcp

我是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());
    }
}

}

2 个答案:

答案 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());
        }
    }
}