【发布时间】:2015-03-07 15:46:16
【问题描述】:
StackOverflow 中提到的讨论 - 对我没有帮助
我正在尝试让客户端在 Android 模拟器上运行,连接到我在同一台机器上运行在 eclipse 上的服务器。 服务器配置为侦听端口 5000。 服务器似乎不是问题。当我在 Eclipse 上运行客户端时,他们可以打开一个套接字并进行通信。 当我尝试在 Android 模拟器上运行 Client 类时,mainActivity 告诉客户端在创建时进行连接。 但由于某种原因,调试流程到达了 catch 块,而不是创建套接字。
我也尝试使用client.connect("10.0.2.2",5000);,但没有帮助。
MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Client client = new Client(this);
try {
client.connect("192.168.1.10",5000);
} catch (IOException e) {
e.printStackTrace();
}
}
Client.java
package com.example.oshri.p;
import java.net.Socket;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Observable;
public class Client extends Observable implements Runnable {
MainActivity creatingActivity; // the activity that creates Client
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private boolean connected;
private int port=5555; //default port
private String hostName="localhost";//default host name
public Client(MainActivity activity) {
connected = false;
this.creatingActivity = activity;
}
public void connect(String hostName, int port) throws IOException {
if(!connected)
{
this.hostName = hostName;
this.port = port;
socket = new Socket(hostName,port);
//get I/O from socket
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(),true);
connected = true;
//initiate reading from server...
Thread t = new Thread(this);
t.start(); //will call run method of this class
}
}
public void sendMessage(String msg) throws IOException
{
if(connected) {
pw.println(msg);
} else throw new IOException("Not connected to server");
}
public void disconnect() {
if(socket != null && connected)
{
try {
socket.close();
}catch(IOException ioe) {
//unable to close, nothing to do...
}
finally {
this.connected = false;
}
}
}
public void run() {
String msg = ""; //holds the msg recieved from server
try {
while(connected && (msg = br.readLine())!= null)
{
creatingActivity.displayServerAnswer("Server:"+msg);
this.setChanged();
this.notifyObservers(msg);
}
}
catch(IOException ioe) { }
finally { connected = false; }
}
public boolean isConnected() {
return connected;
}
public int getPort(){
return port;
}
public void setPort(int port){
this.port = port;
}
public String getHostName(){
return hostName;
}
public void setHostName(String hostName){
this.hostName = hostName;
}
}
【问题讨论】:
-
Client.java 的代码不完整。不要放完整的代码还有什么异常。你能把stacktrace sn -p
-
@aberry 我编辑了问题
-
它是一个在模拟器中用来连接到运行模拟器的机器的本地主机的翻译地址。
-
哦,是的,我监督了这一点。那么你会有一个 NetworkOnMainThread 异常。它将在 logcat 中。
-
确实如此。所有网络代码都应该在一个线程中完成。