2013-10-13 42 views
0

我想构建一个能够接收,处理和响应http请求的简单Web服务器(TCP)。我已经建立了客户端和服务器之间的TCP连接,问题是,尽管我已经尝试过了,但我还没有设法执行http请求。 这些都是客户端和服务器代码中的Java:能够发送http请求的TCP连接

客户端类:

import java.io.BufferedReader; 

import java.io.BufferedWriter; 

import java.io.IOException; 

import java.io.InputStreamReader; 

import java.io.OutputStreamWriter; 

import java.net.Socket; 

import java.net.UnknownHostException; 

public class SocketCliente { 

private String hostname; 
private int porta; 
Socket socketCliente; 

public SocketCliente(String hostname, int porta){ 
    this.hostname = hostname; 
    this.porta = porta; 
} 

public void connect() throws UnknownHostException, IOException{ 
    System.out.println("Tentando se conectar com "+hostname+":"+porta); 
    socketCliente = new Socket(hostname,porta); 
    System.out.println("A conexão foi realizada"); 
} 

public void readResponse() throws IOException{ 
    String userInput; 
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(socketCliente.getInputStream())); 

    System.out.println("Responsta do servidor:"); 
    while ((userInput = stdIn.readLine()) != null) { 
     System.out.println(userInput); 
    } 
} 

public static void main(String arg[]){ 
    //Creating a SocketClient object 
    SocketCliente client = new SocketCliente ("localhost",30000); 
    try { 
     //trying to establish connection to the server 
     client.connect(); 
     //if successful, read response from server 
     client.readResponse(); 

    } catch (UnknownHostException e) { 
     System.err.println("A conexão não pode ser estabelecida."); 
    } catch (IOException e) { 
     System.err.println("Conexão não estabelecida, pois o servidor pode ter problemas."+e.getMessage()); 
    } 
} 
} 

服务器类

import java.io.BufferedReader; 

import java.io.BufferedWriter; 

import java.io.IOException; 

import java.io.InputStreamReader; 

import java.io.OutputStreamWriter; 

import java.io.PrintWriter; 

import java.net.ServerSocket; 

import java.net.Socket; 


public class SocketServidor { 

private ServerSocket serverSocket; 
private int porta; 

public SocketServidor(int porta) { 
    this.porta = porta; 
} 

public void start() throws IOException { 
    System.out.println("Começando o servidor na porta:" + porta); 
    serverSocket = new ServerSocket(porta); 

    //Listen for clients. Block till one connects 

    System.out.println("Esperando o cliente"); 
    Socket client = serverSocket.accept(); 

    //A client has connected to this server. Send welcome message 
    sendMensagemDeBoasVindas(client); 
} 

private void sendMensagemDeBoasVindas(Socket cliente) throws IOException { 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(cliente.getOutputStream())); 
    writer.write("A sua conexão com o SocketServidor foi feita"); 
    writer.flush(); 
} 

/** 
* Creates a SocketServer object and starts the server. 
* 
* @param 
*/ 
public static void main(String[] args) { 
    // Setting a default port number. 
    int portNumber = 30000; 

    try { 
     // initializing the Socket Server 
     SocketServidor socketServer = new SocketServidor(portNumber); 
     socketServer.start(); 

     } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

我真的没有我怎么能做出想法HTTP请求。我试过创建一个http类,我尝试从现有的客户端类发送请求,但目前为止没有任何工作。所有的谷歌搜索都没有帮助。

一位也在尝试这样做的朋友告诉我,在客户端已经建立连接之后,您需要将客户端类的请求发送到服务器类。我该怎么做呢?

请你能帮帮我吗?

@罗宾绿色 客户端类:

import java.io.*; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class SocketCliente { 
private String hostname; 
private int porta; 
Socket socketCliente; 

public SocketCliente(String hostname, int porta){ 
    this.hostname = hostname; 
    this.porta = porta; 
} 

public void connect() throws UnknownHostException, IOException{ 
    System.out.println("Tentando se conectar com "+hostname+":"+porta); 
    socketCliente = new Socket(hostname,porta); 
    System.out.println("A conexão foi realizada"); 
} 

public void readResponse() throws IOException{ 
    String userInput; 
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(socketCliente.getInputStream())); 

    System.out.println("Responsta do servidor:"); 
    while ((userInput = stdIn.readLine()) != null) { 
     System.out.println(userInput); 
    } 
} 
public void HTTPCliente() throws Exception{ 
    PrintWriter out = new PrintWriter(new OutputStreamWriter(socketCliente.getOutputStream())); 
    System.out.println("GET/HTTP/1.1"); 
    System.out.println("User-Agent: test/1.0"); 
    System.out.println("Host: localhost"); 
    System.out.println("Accept: */*"); 
} 

public static void main(String arg[]){ 
    //Creating a SocketClient object 
    SocketCliente client = new SocketCliente ("localhost",30000); 
    try { 
     //trying to establish connection to the server 
     client.connect(); 
     //if successful, read response from server 
     client.readResponse(); 
     try { 
      //se http obtiver sucesso 
      client.HTTPCliente(); 
     } catch (Exception ex) { 
      Logger.getLogger(SocketCliente.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } catch (UnknownHostException e) { 
     System.err.println("A conexão não pode ser estabelecida."); 
    } catch (IOException e) { 
     System.err.println("Conexão não pode ser feita por problemas no servidor."+e.getMessage()); 
    } 
} 

}

+1

请向我们展示您尝试从客户端发送请求的代码。 –

+0

对不起,我现在没有和我在一起:不幸的是,我在学校实验室的电脑上忘记了它。 – user2875985

回答

1

您需要发送这样的事情:

GET/HTTP/1.1 
User-Agent: test/1.0 
Host: localhost 
Accept: */* 

所以也许:

PrintWriter out = new PrintWriter(new OutputStreamWriter(socketCliente.getOutputStream())); 
out.println("GET/HTTP/1.1"); 
out.println("User-Agent: test/1.0"); 
out.println("Host: localhost"); 
out.println("Accept: */*"); 

但顺便说一句,这是低层次,更复杂的方式。使用高级API可以更轻松地完成它。但也许这是不允许在这个家庭作业,我不知道。

+0

好的。我在我的Client类中尝试过,但没有发生任何事情:它没有打印或给出错误。那么,服务器在这个过程中做了什么?我如何让他得到这个要求? P.S .:谢谢你的回答! – user2875985

+0

HTTP是一种允许请求将自己定位到特定资源的协议。由于您只有一个资源,因此您可以忽略请求中的数据,但这是一种欺骗行为。所以你真的应该解析请求的第一行,从中提取URL(在本例中为/),如果它是你所期望的,则产生一个合适的HTTP响应。至于为什么没有发生,我不知道 - 请发布您的更新代码。 –

+0

抱歉,延迟。我更新了代码。再次感谢您的帮助。 – user2875985