0

JSCH を使用してリモート サーバーに接続し、そのサーバーから tcp/ip ポート経由で telnet のようなセッションを開こうとしています。サーバー A に接続するとします。接続したら、別のポートを介してサーバー B に tcp 接続を発行します。私の Web サーバー ログには、GET / ログが記録されていますが、期待どおりに GET /foo は記録されていません。私がここに欠けているものはありますか?(接続しているシステムからリモート ポートにアクセスできるため、ポート フォワーディングを使用する必要はありません)

package com.tekmor;

import com.jcraft.jsch.*;

import java.io.BufferedReader;
.
.

public class Siranga {

     public static void main(String[] args){
        Siranga t=new Siranga();
           try{
               t.go();
           } catch(Exception ex){
               ex.printStackTrace();
        }
    }
    public void go() throws Exception{
        String host="hostXXX.com";
        String user="USER";
        String password="PASS";
        int port=22;

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");      

        String remoteHost="hostYYY.com";
        int remotePort=80;


       try { 
        JSch jsch=new JSch();
        Session session=jsch.getSession(user, host, port);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        Channel channel=session.openChannel("direct-tcpip");  


        ((ChannelDirectTCPIP)channel).setHost(remoteHost);
        ((ChannelDirectTCPIP)channel).setPort(remotePort);

        String cmd = "GET /foo";

        InputStream in = channel.getInputStream();
        OutputStream out = channel.getOutputStream();

        channel.connect(10000);

        byte[] bytes = cmd.getBytes();          
        InputStream is = new ByteArrayInputStream(cmd.getBytes("UTF-8"));

        int numRead;

        while ( (numRead = is.read(bytes) ) >= 0) {
              out.write(bytes, 0, numRead);
              System.out.println(numRead);
        }

        out.flush();



        channel.disconnect();
        session.disconnect();

        System.out.println("foo");

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

       }

    }
}
4

1 に答える 1

0

HTTP 仕様をもう一度読んでください。リクエスト ヘッダーは、空の行で終了する必要があります。したがって、ヘッダー行がこれ以上ないと仮定すると、少なくとも最後に改行する必要があります。(ここでの改行は CRLF の組み合わせを意味します。)

また、リクエスト行には、URL の後に HTTP バージョン識別子が含まれている必要があります。

したがって、プログラムに次の変更を加えてみてください。

String command = "GET /foo HTTP/1.0\r\n\r\n";

ヒント: ByteArrayInputStream からチャネルの出力ストリームにデータを手動でパイプする代わりに、setInputStreamメソッドを使用できます。また、チャネルの入力ストリームから結果を読み取ることを忘れないでください。

于 2013-05-12T00:12:10.947 に答える