Java 安卓| can';t使用套接字向Wialon服务器发送/接收消息
首先,我知道这是一个非常普遍的问题,我已经浏览了几十种出版物和帖子。它们的解决方案基本相同。但经过几个小时的尝试,这对我仍然不起作用 问题在于发送/接收短信-我没有收到服务器的任何响应。它不是HTTP服务器,所以我使用套接字。我想可能有几个原因:Java 安卓| can';t使用套接字向Wialon服务器发送/接收消息,java,android,sockets,client-server,Java,Android,Sockets,Client Server,首先,我知道这是一个非常普遍的问题,我已经浏览了几十种出版物和帖子。它们的解决方案基本相同。但经过几个小时的尝试,这对我仍然不起作用 问题在于发送/接收短信-我没有收到服务器的任何响应。它不是HTTP服务器,所以我使用套接字。我想可能有几个原因: 连接初始化问题 发送/接收消息的过程可能错误 也许我的建筑有点不对劲 现在输入代码。 初始/开放式套接字连接: private class OpenSocketTask extends AsyncTask<Void, Void, Void
private class OpenSocketTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
// Creating InetAddress object from ipNumber passed via constructor from IpGetter class.
InetAddress serverAddress = InetAddress.getByName(HOST); //also tried instead: socket = new Socket(HOST, PORT);
// Create a new Socket instance and connect to host
socket = new Socket(serverAddress, PORT);
Log.i(TAG, "Socket created: " + HOST + ":" + PORT);
// Create PrintWriter object for sending messages to server.
// out = new PrintWriter(socket.getOutputStream(), true); //also tried this
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
//Create BufferedReader object for receiving messages from server.
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.d(TAG, "In/Out created");
} catch (UnknownHostException e) {
Log.e(TAG, "Don't know about host: " + HOST + ":" +PORT);
connected = false;
Log.e(TAG, e.getMessage());
} catch (IOException e) {
Log.e(TAG, "Couldn't get I/O for the connection to: " + HOST + ":" +PORT);
connected = false;
Log.e(TAG, e.getMessage());
}
connected = true;
return null;
}
@Override
protected void onPostExecute(Void result) {
if (connected) {
Log.d(TAG, "Connected to TCP server...");
}
super.onPostExecute(result);
}
}
私有类OpenSocketTask扩展了异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
//从IpGetter类通过构造函数传递的ipNumber创建InetAddress对象。
InetAddress serverAddress=InetAddress.getByName(主机);//也尝试了:socket=new socket(主机,端口);
//创建新的套接字实例并连接到主机
套接字=新套接字(服务器地址、端口);
Log.i(标记,“创建的套接字:“+HOST+”:“+PORT”);
//创建用于向服务器发送消息的PrintWriter对象。
//out=new PrintWriter(socket.getOutputStream(),true);//也尝试了此方法
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()),true);
//创建用于从服务器接收消息的BufferedReader对象。
in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
Log.d(标记“已创建输入/输出”);
}捕获(未知后异常e){
Log.e(标记“不知道主机:“+host+”:“+PORT”);
连接=错误;
Log.e(标记,e.getMessage());
}捕获(IOE异常){
Log.e(标记“无法获取连接到:“+HOST+”:“+PORT”的I/O);
连接=错误;
Log.e(标记,e.getMessage());
}
连接=真;
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
如果(已连接){
Log.d(标记“已连接到TCP服务器…”);
}
super.onPostExecute(结果);
}
}
发送和接收消息:
public class ServerSendMessageTask extends AsyncTask<Void, Void, Void> {
private String message;
public ServerSendMessageTask(String message){
this.message = message;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
if (connected) {
Log.d(TAG, "Sending command to server: " + message);
try {
out.println(message);
out.flush();
/**
* Alternative for SEND message
* Both didn't work.
* */
// //Send the message to the server
// OutputStream os = socket.getOutputStream();
// OutputStreamWriter osw = new OutputStreamWriter(os);
// BufferedWriter bw = new BufferedWriter(osw);
// bw.write(message);
// bw.flush();
Log.d(TAG, "Message was sent: " + message);
//Listen for the incoming messages while connected = true
while (connected) {
String incomingMessage = in.readLine();
if (incomingMessage != null) {
//never reach here :(
Log.d(TAG, "Received from server string: " + incomingMessage);
}
}
/**
* This is the alternative way to RECEIVE message
* Both didn't work for me
* */
// //Get the return message from the server
// InputStream is = socket.getInputStream();
// InputStreamReader isr = new InputStreamReader(is);
// BufferedReader br = new BufferedReader(isr);
// String response = br.readLine();
// Log.d(TAG, "Received from server string: " + response);
} catch (UnknownHostException e) {
Log.e(TAG, "Don't know about host: " + HOST + ":" +PORT);
Log.e(TAG, e.getMessage());
} catch (IOException e) {
Log.e(TAG, "Couldn't get I/O for the connection to: " + HOST + ":" +PORT);
Log.e(TAG, e.getMessage());
}
}
return null;
}
@Override
protected void onPostExecute(Void res) {
super.onPostExecute(res);
}
}
公共类ServerSendMessageTask扩展了AsyncTask{
私有字符串消息;
公用服务器SendMessageTask(字符串消息){
this.message=消息;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
如果(已连接){
Log.d(标记“向服务器发送命令:”+消息);
试一试{
out.println(消息);
out.flush();
/**
*发送消息的备选方案
*两个都不起作用。
* */
////将消息发送到服务器
//OutputStream os=socket.getOutputStream();
//OutputStreamWriter osw=新的OutputStreamWriter(os);
//BufferedWriter bw=新的BufferedWriter(osw);
//写(信息);
//bw.flush();
Log.d(标记“消息已发送:”+消息);
//在连接时侦听传入消息=true
同时(连接){
字符串incomingMessage=in.readLine();
if(incomingMessage!=null){
//永远不要到达这里:(
Log.d(标签,“从服务器接收的字符串:”+incomingMessage);
}
}
/**
*这是接收消息的另一种方式
*这两个都不适合我
* */
////从服务器获取返回消息
//InputStream=socket.getInputStream();
//InputStreamReader isr=新的InputStreamReader(is);
//BufferedReader br=新的BufferedReader(isr);
//字符串响应=br.readLine();
//Log.d(标签,“从服务器接收的字符串:”+响应);
}捕获(未知后异常e){
Log.e(标记“不知道主机:“+host+”:“+PORT”);
Log.e(标记,e.getMessage());
}捕获(IOE异常){
Log.e(标记“无法获取连接到:“+HOST+”:“+PORT”的I/O);
Log.e(标记,e.getMessage());
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(void res){
super.onPostExecute(res);
}
}
我在活动的onStart()
中以new-OpenSocketTask().execute();
的形式打开套接字,并在按钮上发送消息,使用codenew-serversendmagestask(message.execute();
。因此线程不会“重叠”
另一件事可能是:
我正在尝试将Ping包(参见第6页)发送到服务器。只是为了查看它的工作情况。它看起来像\p\r\n
。因此,如果一切正常,我应该会收到此字符串:\AP\r\n
Java的格式不太清楚,因此我尝试发送不同的消息组合:\p\r\n
,\p\35; \\ r\\n
,\p
,没有区别
你能在这里指出我的错误吗?你没有告诉我到底发生了什么。那么我们怎么知道呢?
然后点击按钮发送消息。
。怎么猜?我们应该怎么猜?如果你这样初始化:String message=“\p\r”
并使用带有out.println(message)
的println writer,然后使用println()将添加\n以便wialon服务器将接收“#P#\r\n”。如果您想与我们联系