したがって、Androidアプリが特別なアクティビティ(正常に動作)でサーバーに接続するたびに、ワンタイムソケット通信を備えたAndroidアプリ(クライアント)とJavaプログラム(サーバー)があります。
私のサーバーはより大きなプログラム(サーバーが情報を取得するSwingコンポーネントを使用)に埋め込まれているため、この(縮小された)コードがここにあります:
//somewhere in my Swing-Application
Server myServer = new Server();
myServer.start();
//...
public class Server extends Thread {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8090);
try {
while (true) {
System.out.println("Server is waiting for connections...");
socket = serverSocket.accept();
startHandler(socket);
}
} finally {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void startHandler(final Socket socket) throws IOException {
System.out.println("Client connected to Server");
Thread thread = new Thread() {
@Override
public void run() {
try {
writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
//doing something usefull, i am sending a JSON-String, which i´ll parse in my app.
writer.write(someStringContainingJSONString);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
closeSocket();
}
}
private void closeSocket() {
try {
socket.close();
} catch (IOException e) {
}
}
};
thread.start();
}
私のAndroidアプリには次のものがあります:
public void onCreate(Bundle savedInstanceState) {
viewJSON = new Runnable() {
@Override
public void run() {
getJSON();
}
};
Thread thread = new Thread(null, viewJSON, "MagentoBackground");
thread.start();
myProgressDialog = ProgressDialog.show(myActivity.this, "Please wait...", "Retrieving data ...", true);
}
private void getJSON() {
try {
socket = new Socket(serverIPAddress, SERVER_PORT);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String help = reader.readLine();
// parse this String according to JSON, is working fine!
}
// catch and so on...
今、Swing-Applicationから「データを送信」ボタンを押すたびに、アプリがデータを受信して、最新のデータを利用できるようにしたいと考えています。
一方、Android アプリに変更を加えたときに、サーバーがデータ (JSON-String) を受信するようにしたいと考えています。特定のボタンを押したときに文字列も送信する必要があります。
どうやってやるの?問題は、ネットワークと組み合わせたスレッド化の問題です (そうしないと、swing アプリケーションが動作しません)。ソケットを閉じないと、プログラムを適切に続行できません (または、少なくとも、現在のコードではそう思われます)。ご協力とご意見をお寄せいただき、誠にありがとうございます。ベスト、アンドレア