在 android 应用程序中调用 java 客户端
Calling a java client in an android application
我有一个客户端可以通过 TCP 向服务器发送一些信息:
public class IR {
private String host; //server IP address indicated here, I deleted it for posting here
private int port = 6789;
private String sentence;
private String reply;
public IR(String type) {
try {
Socket clientSocket = new Socket(host,port); //IP du server ("localhost" pour un server local) et port utilisé
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
Gson gson = new GsonBuilder().create();
FileReader file = new FileReader("data/userInfo.json");
String json = "";
int i = 0;
while ((i = file.read()) != -1)
json += (char)i;
User user = gson.fromJson(json, User.class);
String user_id = user.getID();
int bus_id = user.getBusID();
sentence = "alerte " + type + " " + user_id + " " + bus_id;
System.out.println("SENTENCE: " + sentence);
outToServer.writeBytes(sentence + '\n');
reply = inFromServer.readLine();
System.out.println("ANSWER: " + reply);
clientSocket.close();
}
catch (Exception io) {
System.out.println("Connection refusée: arrêt");
}
}
}
我在我的 android 应用程序中调用它:我有一个按钮,当我点击它时使用这个方法:
public void signalerComplet(View view)
{
client = new IR("complet");
Toast.makeText(this, "envoyé", Toast.LENGTH_SHORT).show();
}
但是我的服务器没有得到任何东西。
不过,我确信我的客户端在我不在我的 android 应用程序中使用时可以正常工作。
有人可以告诉我我在这里缺少什么吗?
编辑 在得到 Hector 的帮助后:服务器得到我的 "bloubloubloub" 但我在 "int size = in.read(data);" 上得到 android.os.NetworkOnMainThreadException ...
private Socket socket;
public void signalerComplet(View view)
{
PrintWriter out = null;
InputStream in=null;
byte[] data = new byte[5120];
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
}
catch (IOException e) {
e.printStackTrace();
}
out.println("bloubloubloub" + '\n');
out.flush();
try {
in = socket.getInputStream();
int size = in.read(data);
}
catch (IOException e) {
e.printStackTrace();
}
Log.e("data from server", data.toString());
}
当你这样做时:
client = new IR("complet");
您将遇到 IR 构造函数中的 else 语句,该语句尽管关闭了连接但什么也不做。
type.equals(null)
将始终是 false
就好像变量 type
实际上拥有一个 null
值一样它将抛出一个 NullPointerException
因为没有方法equals
代表 null
值。因此 if
主体永远不会执行。
如果变量是 null
,则正确的匹配方法是 ==
运算符。
if (type == null) {
// do this
} else {
// do that
}
equals()
上的 String
应该用于与另一个 String
进行比较。
在 Android 中,您不能将所有这些代码都放在 onCreate
方法(例如)和 运行 中,因为您无法启动阻塞的进程主线程,在这种情况下 Socket clientSocket = new Socket(host,port);
将阻塞主线程,您的应用程序将崩溃。您需要使用线程进行此 tcp 通信。请尝试此代码并遵循此算法:
创建这个内部 class,这将使用线程执行套接字连接:
class ClientThread implements Runnable {
@Override
public void run() {
try {
socket = new Socket(ipServer, portServer);
} catch (UnknownHostException e1) {
threadMsg("Connection fails");
} catch (IOException e1) {
threadMsg("Connection fails");
}
}
}
在onCreate
方法中调用这个
new Thread(new ClientThread()).start();
在你的发送按钮中应该放这样的东西:
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
} catch (IOException e) {
e.printStackTrace();
}
out.println(messageToServer);
out.flush();
这应该将字符串发送到服务器套接字。您还需要添加一些基本验证。
编辑: 要从服务器获取数据,请在新的 onClick 按钮方法中添加此代码:
byte[] data = new byte[5120];
try {
in = socket.getInputStream();
int size = in.read(data);
// see the received data from server in you LogCat
Log.e("data from server", data.toString());
} catch (Exception e) {
e.printStackTrace();
}
希望对您有所帮助。
这是我所做的。再次感谢 Hector 的帮助。效果很好。任何可能 "magnified" 的内容都将不胜感激。 :)
public class SignalerProblemeActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.signaler_probleme);
}
public void signalerComplet(View view)
{
new Thread(new CompletThread()).start();
Toast.makeText(this, "Signalement de bus complet envoyé", Toast.LENGTH_SHORT).show();
}
class CompletThread implements Runnable {
@Override
public void run() {
Socket socket=null;
User u = new User("momo",12);
String sentence="alerte complet "+u.getID()+u.getBusID();
try {
//CREATION SOCKET
socket=new Socket("123.456.789.10",6789);
//SENDING
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(sentence);
//GETTING
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String mstr=br.readLine();
Log.e("CLIENT",mstr);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch(Exception e)
{
Log.e("CLIENT",e.toString());
}
}
}
}
我有一个客户端可以通过 TCP 向服务器发送一些信息:
public class IR {
private String host; //server IP address indicated here, I deleted it for posting here
private int port = 6789;
private String sentence;
private String reply;
public IR(String type) {
try {
Socket clientSocket = new Socket(host,port); //IP du server ("localhost" pour un server local) et port utilisé
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
Gson gson = new GsonBuilder().create();
FileReader file = new FileReader("data/userInfo.json");
String json = "";
int i = 0;
while ((i = file.read()) != -1)
json += (char)i;
User user = gson.fromJson(json, User.class);
String user_id = user.getID();
int bus_id = user.getBusID();
sentence = "alerte " + type + " " + user_id + " " + bus_id;
System.out.println("SENTENCE: " + sentence);
outToServer.writeBytes(sentence + '\n');
reply = inFromServer.readLine();
System.out.println("ANSWER: " + reply);
clientSocket.close();
}
catch (Exception io) {
System.out.println("Connection refusée: arrêt");
}
}
}
我在我的 android 应用程序中调用它:我有一个按钮,当我点击它时使用这个方法:
public void signalerComplet(View view)
{
client = new IR("complet");
Toast.makeText(this, "envoyé", Toast.LENGTH_SHORT).show();
}
但是我的服务器没有得到任何东西。 不过,我确信我的客户端在我不在我的 android 应用程序中使用时可以正常工作。 有人可以告诉我我在这里缺少什么吗?
编辑 在得到 Hector 的帮助后:服务器得到我的 "bloubloubloub" 但我在 "int size = in.read(data);" 上得到 android.os.NetworkOnMainThreadException ...
private Socket socket;
public void signalerComplet(View view)
{
PrintWriter out = null;
InputStream in=null;
byte[] data = new byte[5120];
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
}
catch (IOException e) {
e.printStackTrace();
}
out.println("bloubloubloub" + '\n');
out.flush();
try {
in = socket.getInputStream();
int size = in.read(data);
}
catch (IOException e) {
e.printStackTrace();
}
Log.e("data from server", data.toString());
}
当你这样做时:
client = new IR("complet");
您将遇到 IR 构造函数中的 else 语句,该语句尽管关闭了连接但什么也不做。
type.equals(null)
将始终是 false
就好像变量 type
实际上拥有一个 null
值一样它将抛出一个 NullPointerException
因为没有方法equals
代表 null
值。因此 if
主体永远不会执行。
如果变量是 null
,则正确的匹配方法是 ==
运算符。
if (type == null) {
// do this
} else {
// do that
}
equals()
上的 String
应该用于与另一个 String
进行比较。
在 Android 中,您不能将所有这些代码都放在 onCreate
方法(例如)和 运行 中,因为您无法启动阻塞的进程主线程,在这种情况下 Socket clientSocket = new Socket(host,port);
将阻塞主线程,您的应用程序将崩溃。您需要使用线程进行此 tcp 通信。请尝试此代码并遵循此算法:
创建这个内部 class,这将使用线程执行套接字连接:
class ClientThread implements Runnable {
@Override
public void run() {
try {
socket = new Socket(ipServer, portServer);
} catch (UnknownHostException e1) {
threadMsg("Connection fails");
} catch (IOException e1) {
threadMsg("Connection fails");
}
}
}
在onCreate
方法中调用这个
new Thread(new ClientThread()).start();
在你的发送按钮中应该放这样的东西:
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
} catch (IOException e) {
e.printStackTrace();
}
out.println(messageToServer);
out.flush();
这应该将字符串发送到服务器套接字。您还需要添加一些基本验证。
编辑: 要从服务器获取数据,请在新的 onClick 按钮方法中添加此代码:
byte[] data = new byte[5120];
try {
in = socket.getInputStream();
int size = in.read(data);
// see the received data from server in you LogCat
Log.e("data from server", data.toString());
} catch (Exception e) {
e.printStackTrace();
}
希望对您有所帮助。
这是我所做的。再次感谢 Hector 的帮助。效果很好。任何可能 "magnified" 的内容都将不胜感激。 :)
public class SignalerProblemeActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.signaler_probleme);
}
public void signalerComplet(View view)
{
new Thread(new CompletThread()).start();
Toast.makeText(this, "Signalement de bus complet envoyé", Toast.LENGTH_SHORT).show();
}
class CompletThread implements Runnable {
@Override
public void run() {
Socket socket=null;
User u = new User("momo",12);
String sentence="alerte complet "+u.getID()+u.getBusID();
try {
//CREATION SOCKET
socket=new Socket("123.456.789.10",6789);
//SENDING
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(sentence);
//GETTING
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String mstr=br.readLine();
Log.e("CLIENT",mstr);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch(Exception e)
{
Log.e("CLIENT",e.toString());
}
}
}
}