使用HTTP1.0协议,构建一个简单的Web Server和一个客户端

一、Client端代码

class Client{

    public static void main(String argv[]) throws Exception
    {
        int conNum=0;
        long dataFlow=0;
        boolean end=false;

        while(!end){
            String sentence;
            //create input stream
            BufferedReader inFromUser =
                    new BufferedReader(new InputStreamReader(System.in));
            //create client socket, connect to server
            conNum++;
            Socket clientSocket = new Socket("127.0.0.1", 6789);
            //create output stream attached to socket
            DataOutputStream outToServer =
                    new DataOutputStream(clientSocket.getOutputStream());
            //create input stream attached to socket
            BufferedReader inFromServer =
                    new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            //send line to server
            sentence = "Get "+inFromUser.readLine()+" HTTP/1.0";
            outToServer.writeBytes(sentence + '\n');
            dataFlow+=sentence.length();

            //read line from server
            String line=null;
            System.out.println("Connection numbers: "+ conNum);
            System.out.println("Data flow: "+ dataFlow);

            while((line=inFromServer.readLine())!=null){
                if(line.equals("Server Closed!"))end=true;
                System.out.println(line);
            }
            clientSocket.close();
            conNum--;
        }

    }
}

二、Server端代码

public class Server {
    public static void main(String args[]) throws Exception{
        //requestMessageLine is a String includes the request line of http request
        String requestMessageLine;
        String fileName;


        //create a welcoming socket at port 6789
        ServerSocket listenSocket=new ServerSocket(6789);
        while(true){
            //wait, on welcoming socket for contact by client
            Socket connectionSocket =listenSocket.accept();
            //create input stream, attached to socket
            BufferedReader inFromClient=new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            //create output stream, attached to socket
            DataOutputStream outToClient=new DataOutputStream(connectionSocket.getOutputStream());
            //read in line from socket
            requestMessageLine=inFromClient.readLine();
            StringTokenizer tokenizedLine=new StringTokenizer(requestMessageLine);
            if(tokenizedLine.nextToken().equals("Get")){
                fileName=tokenizedLine.nextToken();
                //if the request is "END", then close the server
                if(fileName.equals("END")){
                    outToClient.writeBytes("Server Closed!");
                    connectionSocket.close();
                    break;
                }

                //get the information of the requested file
                if(fileName.startsWith("/")==true)fileName=fileName.substring(1);
                try{
                    File file=new File(fileName);
                    int numOfBytes=(int) file.length();
                    FileInputStream inFile=new FileInputStream(fileName);
                    byte[] fileInBytes=new byte[numOfBytes];
                    inFile.read(fileInBytes);

                    //write out line to socket
                    outToClient.writeBytes("http/1.0 200 OK\r\n");
                    if(fileName.endsWith(".jpg")) outToClient.writeBytes("Content-Type: image/jpeg\r\n");
                    if(fileName.endsWith(".gif")) outToClient.writeBytes("Content-Type: image/gif\r\n");
                    outToClient.writeBytes("Content-Length:"+numOfBytes+"\r\n");
                    outToClient.writeBytes("\r\n");
                    outToClient.write(fileInBytes,0,numOfBytes);
                }catch(Exception e){
                    outToClient.writeBytes("http/1.0 404 NOT FOUND\r\n");
                }finally{
                     connectionSocket.close();
                }

            }else System.out.println("Bad Request Message");
        }

    }
}

三、运行方式

  1. 打开命令行进入代码文件夹,输入“javac *.java”编译所有java文件
  2. 运行Server,输入“java Server”
  3. 打开另一个命令行进入代码文件夹,输入“java Client”运行Client
  4. 在代码文件夹中放入需要传输的文件,在Client中输入文件名称,Server会返回文件信息
  5. 输入”END”,Client和Server均会终止

你可能感兴趣的:(计算机网络实验)