4

サーバー/ソケットプログラミングをしようとしています。サーバー コードは、Ubuntu マシン上でプレーン Java で記述されています。クライアント コードは、私の LG スリル用に書かれています。サーバーは正常に動作しているようです。基本的に「localhost」のIPでtry/catchブロックを使用する単純なテストクライアントをプレーンJavaで作成して、サーバーをテストしました。電話からサーバーマシンにsshして、IPに到達できるかどうかを確認しました(はい、到達可能です)。

私のサーバーコードは次のようになります。

package org.vsector.server;

import java.io.IOException;
import java.net.ServerSocket;

public class SceneFlowServer {

    int port;
    Thread running = null;
    CameraHandler handler = null;

    public SceneFlowServer( int port, CameraHandler handler ){

        this.port = port;
        this.handler = handler;

    }

    public void start(){

        if( handler == null ) return;

        try{

            running = new Thread(){

                public void run(){

                    try{

                        ServerSocket listen = new ServerSocket( port );
                        while( true ){

                            System.out.print( "I am waiting on port " + port + "... " );
                            handler.accept( listen.accept() );
                            System.out.println( "Got someone!" );
                            Thread spinoff = new Thread( handler );
                            spinoff.start();

                        }

                    }catch( IOException e ){

                        System.err.println( "Could not listen on port " + port + "!" );
                        System.err.flush();
                        return;

                    }

                }

            };
            running.start();
            running.join();

        }catch( Exception e ){

            System.err.println( "Could not start thread!" );
            System.err.flush();

        }

    }

}

私の CameraHandler コード:

package org.vsector.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class CameraHandler implements Runnable {

    Socket client = null;

    public CameraHandler(){ }

    public void accept( Socket client ){

        this.client = client;

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        BufferedReader in;
        try {
            in = new BufferedReader( new InputStreamReader( client.getInputStream() ));
            System.out.println( in.readLine() );
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            client.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

私のクライアントコードは次のようになります:

package org.vsector.client;

import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ProcessingClientActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView text = (TextView) findViewById( R.id.textBox );

        Socket sock;
        try {
            text.append( "\nOpening and writing to socket... " );
            sock = new Socket();
            sock.connect( new InetSocketAddress( "some ip", 4444 ), 30000 );
            PrintWriter out = new PrintWriter( sock.getOutputStream(), true );
            out.println( "Hello!" );
            out.close();
            sock.close();
            text.append( "Done!" );
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            text.append( "Error: " + e + "\n" );
            text.append( e.getMessage() );
        } 

    }
}

アクセス許可は設定されていますが、それでも「エラー: java.net.SocketTimeoutException: 接続がタイムアウトしました」という結果になります。

何が原因なのかわからない!何か案は?

編集:

どうでも。ネットワークの問題。ホーム ネットワークでコードを実行したところ、すべて問題なく動作しました。

4

2 に答える 2

1

コードには実際の問題はありませんが、私が使用していたネットワークにはすべて問題がありました。

ホームネットワークに移動した後、すべてが機能します。

于 2012-06-27T16:39:29.387 に答える
1

おい、それらの間に flush() を追加してみてください:

out.println( "Hello!" );
out.flush();  //add this line
out.close();

あなたは多分速くするためにソケットを閉じています..

于 2012-06-18T21:34:37.043 に答える