gpt4 book ai didi

android - 在 Android 中连接 2 个模拟器实例

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:23 26 4
gpt4 key购买 nike

我想在 2 Emulator 中创建一个 Server 和一个 Client 来写入和读取数据。我为服务器编写代码:

public class ServerActivity extends Activity {
/** Called when the activity is first created. */
private ServerSocket serverSocket = null;
private TextView tv;
public static final int SERVERPORT = 4444;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tv= (TextView) findViewById(R.id.myTextView);
try {
Connect();
} catch (IOException e) {
// TODO Auto-generated catch block
tv.setText("Not connected");
e.printStackTrace();
}
}

public void Connect() throws IOException
{
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("10.0.2.15", 4444));
while(true)
{
Socket socket = serverSocket.accept();
tv.setText("Connected...");
}


}

和客户端代码

public class ClientActivity extends Activity {
/** Called when the activity is first created. */
private Button bt;
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

bt = (Button) findViewById(R.id.myButton);
tv = (TextView) findViewById(R.id.myTextView);
bt.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
try {
Socket socket = new Socket("10.0.2.2", 4445);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
tv.setText("Error1");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
tv.setText("Error2");
e.printStackTrace();
}

}
});
}
}

我设置了一个重定向:

telnet localhost 5554
redir add tcp:4445:4444

但它没有连接....请帮助我。我很感激。

最佳答案

一段时间后我成功了。我根本没有在服务器或客户端中提及 10.0.2.15。我以不同的方式打开服务器套接字,并在单独的线程中处理通信。我在模拟器 5554 上运行服务器,在 5556 上运行客户端。

我的服务器代码,监听6000

public class SocketServer extends Activity {
ServerSocket ss = null;
String mClientMsg = "";
Thread myCommsThread = null;
protected static final int MSG_ID = 0x1337;
public static final int SERVERPORT = 6000;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.TextView01);
tv.setText("Nothing from client yet");
this.myCommsThread = new Thread(new CommsThread());
this.myCommsThread.start();
}

@Override
protected void onStop() {
super.onStop();
try {
// make sure you close the socket upon exiting
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}

Handler myUpdateHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ID:
TextView tv = (TextView) findViewById(R.id.TextView01);
tv.setText(mClientMsg);
break;
default:
break;
}
super.handleMessage(msg);
}
};
class CommsThread implements Runnable {
public void run() {
Socket s = null;
try {
ss = new ServerSocket(SERVERPORT );
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
Message m = new Message();
m.what = MSG_ID;
try {
if (s == null)
s = ss.accept();
BufferedReader input = new BufferedReader(
new InputStreamReader(s.getInputStream()));
String st = null;
st = input.readLine();
mClientMsg = st;
myUpdateHandler.sendMessage(m);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

我重定向了类似于你的端口

telnet localhost 5554
redir add tcp:5000:6000

我的客户端代码在端口 5000 上建立连接:

public class SocketClient extends Activity {
private Button bt;
private TextView tv;
private Socket socket;
private String serverIpAddress = "10.0.2.2";
// AND THAT'S MY DEV'T MACHINE WHERE PACKETS TO
// PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S
// PORT 6000
private static final int REDIRECTED_SERVERPORT = 5000;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt = (Button) findViewById(R.id.myButton);
tv = (TextView) findViewById(R.id.myTextView);

try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}

bt.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
try {
EditText et = (EditText) findViewById(R.id.EditText01);
String str = 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("Error1");
e.printStackTrace();
} catch (IOException e) {
tv.setText("Error2");
e.printStackTrace();
} catch (Exception e) {
tv.setText("Error3");
e.printStackTrace();
}
}
});
}
}

服务器有一个 TextView 来接收消息,客户端有一个 EditText 来编写消息和一个发送消息的按钮。

关于android - 在 Android 中连接 2 个模拟器实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4683854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com