2012-01-26 8 views
1

소켓을 사용하여 서버와 스트리밍 연결을 설정하고 있습니다. 소켓을 생성함으로써 소켓을 사용하여 서버에 요청을 보내려고했습니다. 그러나 어떤 방법을 사용하든 상관없이 요청은 서버에 의해 수신되지 않습니다. 이들은 내가 요청을 보내는 데 사용했던 방법입니다.java에서 소켓을 사용하여 서버에 요청 보내기

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println(query); 

또는 다른 하나는 내가 보내려고 요청이 같은 것입니다

out = new ObjectOutputStream(connection.getOutputStream()); 
out.writeObject(msg); 
out.flush(); 

입니다 :이 쿼리를 보내는 사용하여 훨씬 쉽다는 것을 알고

String query = String.format("cmd=%s&version=%s", "handshake", "1.0"); 

Http 연결하지만, 이것이 완료되어야하는 방법입니다. 그러니 제발 도와주세요. 이는 HttpConnection에이

String charset = "UTF-8"; 
String query = String.format("cmd=%s&version=%s", "handshake", "1.0"); 
String charset = "UTF-8"; 
URL url = new URL("serveraddress:8080");   
URLConnection conn = url.openConnection();   
conn.setDoOutput(true);    
conn.connect();    
OutputStream output = conn.getOutputStream();    
output.write(command.getBytes(charset));          

InputStreamReader content = new InputStreamReader(conn.getInputStream());        
String result =""; 
int c = content.read(); 
while (c != -1) { 
    result = result + ((char) c); 
     c = content.read(); 
} 
Log.v(logTag, "Received: [" + result + "]"); 

명령이며, 이것은 내가 소켓 연결을 열 로그 서버에 따라

URL url = new URL("serveraddress:8080");    
String server_name = url.getHost(); 
int port = url.getPort(); 
Socket socket = new Socket(server_name, port);       

String query = "post /swarm HTTP/1.1\nHost: serveraddress\n" + 
"content-length: 27\nkeep-alive: 300\nconnection: keep-alive\n\n" + 
"cmd=handshake&version=1.0\n"; 

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println(query); 

작동하지 않았다 소켓했고, 모든 요청

을받지 않고 폐쇄 것입니다
+0

서버가 수신하는 포트로 텔넷 할 수 있습니까? – lobster1234

+0

httpconnection을 사용하여 적절한 답장을 받았는데 소켓을 사용하는 것이 다른 것으로 생각합니까? 내 말은 http 연결이 작동하여 포트가 괜찮은 것입니다. 권리? – Daniel

+0

예, 포트가 정상이어야합니다. 소켓을 사용할 때 어떤 예외 상황이 보이십니까? – lobster1234

답변

4

당신이 언급 한 세 가지 메소드 (PrintWriter, ObjectOutputStream 및 HTTPConnection)는 모두 서버로 보내지 만 실제 전송되는 것은 다양한 메소드간에 크게 다를 것이다. 모든

첫째, 자바 ObjectOutputStream 클래스는 것이다 인코딩 당신이 이러한 개체의 인스턴스, 특히 클래스 이름입니다 클래스에 대한 정보와 함께 쓸 객체는 서명 등이 실질적으로 단지 적절한 때를 다른 쪽에서 ObjectInputStream을 사용하는 다른 Java 응용 프로그램과 통신하여 읽습니다. 특히 HTTP 프로토콜을 따르지 않으므로 HTTPConnection을 사용할 수있는 모든 기능을 전혀 사용할 수 없습니다.

HttpURLConnection을 사용하면 실제로 연결하려는 서버에 완전한 (가장 중요한 것은 유효한) HTTP 요청을 구성하여 전송합니다. 당신이 있다면 예를 들어, 다음 코드를 실행합니다 :

URL url = new URL("http://localhost/test?cmd=handshake&version=1.0"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.connect(); 

결과는 응용 프로그램이 로컬 호스트에 연결하는 것입니다 : 80하고 다음과 같은 것을 쓴다. (이것은 간단한 요청입니다이 것 추가 헤더와 실제 요청 정보를합니다.)

GET /test?cmd=handshake&version=1.0 HTTP/1.1 
Host: localhost 

마지막으로, 당신이 실제로 서버에 순수 텍스트를 보낼 것입니다 그 다음 의 PrintWriter를 사용하는 경우. 그러나 서버가 HTTP 서버 (HTTP 연결에 응답한다고 말하기 때문에)의 경우 명령의 일부만 보내면됩니다. GET, HTTP 버전, 어쩌면 일부 헤더, 뒤 따르는 빈 줄 및 CRLF 줄 끝을 포함하여 나머지도 보내야합니다. 이것은 모두 PrintWriter를 사용하여 수행 할 수 있습니다.

Wireshark와 같은 네트워크 패킷 분석기를 설치하고 http 연결을 사용하여 연결을 수행 한 다음 실제로 수동으로 요청을 구성하여 서버로 보내지는 것을 실제로 확인하는 것이 좋습니다 .

또한 HTTP 프로토콜에 대한 자세한 내용을 읽는 것이 좋습니다. 좋은 출발점은 Wikipedia article 일 수 있습니다. 영업의 새로운 정보를 기반으로

편집 : 나는 추측 할 수 일부 업데이트 된 코드에서 몇 가지 작은 불일치, 복사 - 붙여 넣기 실수가 난 그냥 지적하고 싶으면 다른 사람이 거기에 있습니다

경우에.

URLConnection 기반 솔루션은 "/ swarm"리소스를 지정하지 않습니다. 추가는 요청이 실제로 보내 졌는지 여부, 또는 유효한지 여부는 변경하지 않지만 요청을 로그에서 찾을 수 있는지 여부에 영향을 줄 수 있습니다.

POST이 소문자로 작성되었다는 점을 제외하면 전체적으로 쿼리 문자열이 적합합니다. 처음에는 이것이 어떤 차이가 있다고 생각하지 않았지만 텔넷을 통해 www.google.com에 대해 "get"대 "GET"을 시도 할 때 차이가 나는 것처럼 보입니다. 웹 서버가 요청을 요청으로 인식하지 못하면 요청을 처리 할 수 ​​없으므로 예상대로 로그에 표시되지 않을 수 있습니다.

서버 응답을 실제로 읽은 다음 System.out에 출력하여 서버가 특정 오류를보고하는지 확인하는 것이 좋습니다.

+0

먼저 전체 및 종합 설명에 감사드립니다. 이것은 서버에 보내는 실제 요청입니다. – Daniel

+0

문자열 요청 = "POST/swarm HTTP/1.1 \ nHost : serveraddress \ ncontent-length : 27 \ n keep-alive : 300 \ nconnection : keep-alive \ n \ n cmd = handshake & version = 1.0 \ n – Daniel

+0

HTTP 요청에서 언급해야 할 모든 것을 언급했지만, 네트워크 패킷 분석기를 사용하는 것이 좋습니다. 나는 그것을 시도 할 것입니다. – Daniel

관련 문제