0

簡単にするために、私がやろうとしているのは、単純な文字列を含むメッセージを Android Emulator から Eclipse 上の Java コンソール サーバーに送信することだけです。次に、サーバーに別の文字列で応答してもらいます。もちろん; ホスト 10.0.2.2 に接続し、開いているポート (私の場合は 4000) を使用します。エミュレーターの接続ボタンをクリックするたびに、サーバーは「接続済み」というメッセージを受け取りますが、パケットまたはメッセージを配信する方法が見つかりません。

いくつかのコードを読みたい場合は、単純なタスクには長すぎるコード (私が思うに) を次に示します。

クライアント パッケージ com.example.clienttest;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    Thread m_objThreadClient;
    Socket clientSocket;
    TextView serverMessage;
    EditText clientMessage;
    String sIn, sOut;
    ObjectOutputStream oos;
    ObjectInputStream ois;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serverMessage = (TextView) findViewById(R.id.textView1);
        clientMessage = (EditText) findViewById(R.id.editText1);

    }


    public void Start(View view) throws IOException{
        final String Text;
        String send = " ";
        Text = clientMessage.getText().toString();
        m_objThreadClient = new Thread( new Runnable(){
            public void run()
            {
                try {
                    clientSocket = new Socket("10.0.2.2", 4000);
                    oos = new ObjectOutputStream (clientSocket.getOutputStream());
                    oos.writeObject(Text);
                    oos.flush();

                } catch (IOException e) {
                    serverMessage.setText(e.getMessage());
                }

            }
        });
        serverMessage.setText(send);

        m_objThreadClient.start();

    }

}

とサーバー

import java.net.ServerSocket;
import java.net.Socket;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;

import java.util.Hashtable;

public class Server2 {

    @SuppressWarnings("resource")
    public static void main (String[] args) throws IOException {

        ServerSocket server = null;  
        try {
            server = new ServerSocket(4000); 
        } catch (IOException e) {
            System.err.println("Could not start up on: " + "4000" + "Maby server is already open? Or a portforwording messup?");
            System.err.println(e);
            System.exit(1);
        }

        Socket client = null;
        while(true) {
            try {
                client = server.accept();
                System.out.print("connected");
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.err.println(e);
            }

            Thread t = new Thread(new ClientConn(client));
            t.start();
        }
    }
}


class ClientConn implements Runnable {
    private Socket client;
    ObjectInputStream ois;
    ObjectOutputStream oos;

    ClientConn(Socket client) {
        this.client = client;
        try {
            ois = new ObjectInputStream(client.getInputStream());
            String Recv;
            Recv = ois.readLine();

            oos = new ObjectOutputStream(client.getOutputStream());
            oos.writeChars("Welcome");
            oos.flush();

            oos.close();

        } catch (IOException e) {
            System.err.println(e);
            return;
        }
    }

    public void run() {
        String msg, response;
        try {
            System.out.print("checking");
            while ((msg = ois.readLine()) != null) {
                System.out.print(msg);
            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }

    public void sendMsg(String msg) throws IOException {
        oos.writeChars(msg);
    }
}

ありがとう〜

4

1 に答える 1

0

問題を解決するかもしれないし、しないかもしれないいくつかの考え:

ObjectInputStream のメソッド readLine() は廃止されました。代わりに DataInputStream を使用してみてください。何かのようなもの :

try {
        outToClient = new DataOutputStream(socket.getOutputStream());
        inFromClient = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

その後 :

inFromClient.readLine();

読み取り行は、改行文字 '\n' に遭遇するまで読み取り続けることに注意してください。したがって、改行を読み取るまで readLine() はブロックされます。

これらのことを試して、役立つかどうかを確認してください

編集: DataInputStream の readLine() も廃止されたようですが、他にも機能するメソッドがいくつかあります。たとえば、readUTF()

于 2013-09-24T18:09:20.940 に答える