导语
上篇博客中,面向UDP的Android——PC双向通信(一):实现Android客户端和PC服务器端的单向通信,我们介绍了如何实现Android客户端向Java服务器端发送消息,这次我们尝试实现两者之间的双向通信。
我们需要实现的是,对于Android客户端,增加接收信息的方法,对于Java服务器端,增加发送消息的方法。
Android客户端
我们需要增加的是接收消息的方法,接收到消息后,将消息显示在页面上。
接收消息的代码与上篇博客Java服务器端接收消息的代码类似:
public DatagramSocket socket;
public void receiveMsg(){
try{
//创建socket对象
socket = new DatagramSocket(9999);
while(true){
byte data[] = new byte[1000];
//创建数据报包
DatagramPacket request = new DatagramPacket(data,data.length);
//接收数据报包
socket.receive(request);
String s = new String(data,"GBK");
/*将数据显示在页面上*/
......
}
} catch(Exception e){
e.printStackTrace();
}
}
由于接收消息是在子线程中进行的,但组件只能在主线程中进行修改,所以需要用到Android特有的消息处理机制handler机制。
先创建Handler对象,重写handleMessage(Message msg)方法:
private Handler handler = new Handler(){
public void handlerMessage(Message msg){
String s = (String) msg.obj;
TextReceive.setText(s);
}
}
再在接收消息的方法中增加发送消息到主线程消息队列的代码即可:
Message message = handler.obtainMessage();
message.obj = s;
handler.sendMessage(message);
Java服务器端
Java服务器端需要增加发送消息的代码,和Android客户端增加消息的代码类似。
/**
* 发送消息
* @throws Exception
*/
public void sendMsg() throws Exception{
System.out.println("准备发送消息");
String Msg = MsgSend.getText();
System.out.println("要发送的消息是: "+Msg);
byte data[] = Msg.getBytes("GBK");
DatagramPacket request =
new DatagramPacket(data,data.length,ClientAddress,9999);
socket.send(request);
System.out.println("发送成功");
}
示例代码
客户端代码
package com.myscelyn.udpclient;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net