GoogleTVボックスを持っています。そして私は2台の携帯電話を持っています。
GoogleTVBoxでサーバーを実行しています。サーバーには、ポート6001に1つのServerSocketがあります。また、サーバーには、2つのクライアント用に2つのソケットがあります。
最初のデバイスはサーバーに接続し、ソケット番号を1つ2つ使用します。
2台のデバイスからGoogleTVボックスソケットに異なるメッセージを同時に投稿して、テレビに表示することができます。
私は次の解決策を使用しています:
モバイルクライアント向け(2デバイス)
空白のアクティビティを含む新しいAndroidプロジェクトを作成し、このコードをにコピーします。エディットテキストとボタンを含むクライアントのレイアウトを作成します。ANDROIDMANIFEST.XMLでインターネットを設定し、ネットワークの許可にアクセスするようにしてください!!! そして、このファイルのserverIpAddressをサーバーのアクセス可能なIPに編集します。
package de.android.googletv.gameclient;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
/**
*
*
*
*/
public class FullscreenActivity extends Activity {
private Socket socket;
private String serverIpAddress = "192.168.22.253"; // GOOGLE TV IP
private static final int PLAYER_1_SERVERPORT = 6001;
private Button bt;
private TextView tv;
String DEVICE_NAME;
private class ConnectToServer extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
System.out.println("connecting to server...");
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
socket = new Socket(serverAddr, PLAYER_1_SERVERPORT);
} catch (UnknownHostException e1) {
System.out.println("ERROR REACHING SERVER! 1");
e1.printStackTrace();
} catch (IOException e1) {
System.out.println("ERROR REACHING SERVER! 2");
e1.printStackTrace();
}
System.out.println("Done!");
return params;
}
protected void onPostExecute() {
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fullscreen);
DEVICE_NAME = android.os.Build.MODEL;
Button exit = (Button) findViewById(R.id.dummy_button);
exit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.exit(1);
}
});
new ConnectToServer().execute("");
tv = (TextView) findViewById(R.id.editText1);
bt = (Button) findViewById(R.id.button1);
bt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
Random rnd = new Random();
EditText et = (EditText) findViewById(R.id.editText1);
String str = DEVICE_NAME + " ID" + rnd.nextInt() + " says: " + et.getText().toString();
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true
);
out.println(str);
Log.d("Client", "Client sent message");
}
catch (UnknownHostException e) {
tv.setText("UnknownHostException");
e.printStackTrace();
}
catch (IOException e) {
tv.setText("IOException");
e.printStackTrace();
}
catch (Exception e) {
tv.setText("Exception");
e.printStackTrace();
}
}
});
}
}
サーバー用(グーグルTVボックス)
空白のアクティビティを持つ新しいAndroidプロジェクトを作成し、このコードをにコピーします。テキストフィールドのみでレイアウトを作成するANDROIDMANIFEST.XMLでインターネットを設定し、ネットワークの許可にアクセスするようにしてください!!!
package de.android.googletv.gameserver;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
*
*
*
*/
public class FullscreenActivity extends Activity {
// server socket
ServerSocket ss_plr1 = null;
public static final int SERVERPORT_1 = 6001;
int nr_connections = 0;
// socket for player1
Socket s1;
// socket for player2
Socket s2;
Thread myCommsThread = null;
protected static final int MSG_ID = 0x1337;
String mClientMsg = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fullscreen);
Button exit = (Button) findViewById(R.id.dummy_button);
exit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.exit(1);
}
});
TextView tv = (TextView) findViewById(R.id.fullscreen_content);
tv.setText("Nothing from client yet");
myCommsThread = new Thread(new CommsThread());
myCommsThread.start();
}
@Override
protected void onStop() {
super.onStop();
try {
// make sure you close the socket upon exiting
ss_plr1.close();
}
catch (IOException e) {e.printStackTrace(); }
}
Handler myUpdateHandler = new Handler() {
public void handleMessage(Message msg) {
System.out.println("handleMessage("+msg+")");
switch (msg.what) {
case MSG_ID:
TextView tv = (TextView) findViewById(R.id.fullscreen_content);
tv.setText((String)msg.obj);
break;
default:
break;
}
super.handleMessage(msg);
}
};
class CommsThread implements Runnable {
public void run() {
System.out.println("creating new sockets...");
try {
ss_plr1 = new ServerSocket(SERVERPORT_1 );
if (s1 == null)
s1 = ss_plr1.accept();
if (s2 == null)
s2 = ss_plr1.accept();
}
catch (IOException e) {e.printStackTrace();}
new Thread(new ConnectionHandler(s1, myUpdateHandler)).start();
new Thread(new ConnectionHandler(s2, myUpdateHandler)).start();
}
}
}
...サーバーに必要なのは、スレッド化されたメッセージングの接続ハンドラーです...
サーバープロジェクトに「ConnectionHandler.java」という追加のクラスを作成し、このコードをにコピーします。非同期接続を処理します。
package de.android.googletv.gameserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import android.os.Handler;
import android.os.Message;
public class ConnectionHandler implements Runnable {
Socket m_socket;
Handler m_updateHandler;
public ConnectionHandler(Socket socket, Handler updateHandler) {
m_socket = socket;
m_updateHandler = updateHandler;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
BufferedReader input = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
String st = null;
st = input.readLine();
Message m = new Message();
m.what = 0x1337;
m.obj = st;
m_updateHandler.sendMessage(m);
}
catch (IOException e) { e.printStackTrace();}
}
}
}
これは最も良い解決策ではありません。複数の「良くない」コーディング。たとえば、System.exit(1)。また、サポートされているデバイスは2つだけです。ただし、複数のデバイスで機能するため、目的に合わせて変更することをお勧めします。これは、3つのWebソースと、それを機能させるための私自身の追加の試みに基づいています。その唯一の私のプロトタイプ....
私はそれらにリンクすることはできません:(...評判を下げるために。
すべてをビルドして実行すると、次のようになります。
https://plus.google.com/u/0/109268217221135029753/posts/3iz6SF1hiJa