我想在2 Emulator中创建一个Server和一个Client来写入和读取数据。 我为Server编写代码:
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
但它没有连接....请帮助我。我很感激。
答案 0 :(得分:17)
过了一会儿,我成功了。我没有在服务器或客户端对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来组成消息,还有一个按钮来发送它。
答案 1 :(得分:0)
效果很好
您只需添加两个步骤: 1)在AndroidManifest.xml中的应用程序标记外添加INTERNET权限标记
2)无法使用android> 3因为UI线程的网络限制