简单 udp案例实现,server端 android端
项目结构:
一、UDP案例
--服务端
package com.example.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 服务端代码
* 基本api:
* InetAddress
* DatagramSocket ;
*
*/
public class UdqServer {
private InetAddress mInetAddress;
private int mPort = 7798;//port尽可能用5000以上避免被占用
private DatagramSocket mSocket;
private Scanner mScanner;
public UdqServer(){
try {
mInetAddress = InetAddress.getLocalHost();
System.out.println(mInetAddress.getHostAddress());
mSocket = new DatagramSocket(mPort,mInetAddress);
mScanner = new Scanner(System.in);
mScanner.useDelimiter("\n");//按enter键结束
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
}
}
public void start(){
while (true){
try {
byte[] buf = new byte[1024]; //缓冲区 客户端 发送数据不能超过 1024
DatagramPacket receivedPacket = new DatagramPacket(buf,buf.length);
mSocket.receive(receivedPacket);//阻塞线程 等待数据
//接收到了数据包
InetAddress address = receivedPacket.getAddress();//客户端地址
int port = receivedPacket.getPort();//客户端端口号
byte[] bytes = receivedPacket.getData();//客户端数据
String msg = new String(bytes,0,receivedPacket.getLength());//客户端数据解析成String
System.out.println("address="+address+",port="+port+",msg"+msg);
//返回数据
String returnMsg = mScanner.next();
byte[] returnBytes = returnMsg.getBytes();
DatagramPacket sendPacket = new DatagramPacket(returnBytes,returnBytes.length,
receivedPacket.getSocketAddress());
mSocket.send(sendPacket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
UdqServer udqServer = new UdqServer();
udqServer.start();
}
}
--客户端
package com.example.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class UdpClient {
private String serverIp = "192.168.1.100";//自己电脑的地址
private InetAddress mServerAddress;
private int mServerPort = 7798;
private DatagramSocket mSocket;
private Scanner mScanner;
public UdpClient(){
try {
mServerAddress = InetAddress.getByName(serverIp);
mSocket = new DatagramSocket();
mScanner = new Scanner(System.in);
mScanner.useDelimiter("\n");
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
public void start(){
while (true){
try {
// 发送数据
String clientMsg = mScanner.next();
byte[] clientMsgBytes = clientMsg.getBytes();
DatagramPacket clientPacket =
new DatagramPacket(clientMsgBytes,clientMsgBytes.length,mServerAddress,mServerPort);
mSocket.send(clientPacket);
// 接收数据
byte[] buf = new byte[1024];
DatagramPacket serverMsgPacket = new DatagramPacket(buf,buf.length);
mSocket.receive(serverMsgPacket);
String serverMsg = new String(serverMsgPacket.getData(),0,serverMsgPacket.getLength());
System.out.println("msg="+serverMsg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
UdpClient udpClient = new UdpClient();
udpClient.start();
}
}
运行先启动服务端(服务端先等待客户端数据),再启动客户端代码,结果如下:
---android端
业务类
package com.example.socket.Biz;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class UdpBiz {
private String serverIp = "192.168.1.100";
private InetAddress mServerAddress;
private int mServerPort = 7798;
private DatagramSocket mSocket;
private Handler uiHandler = new Handler(Looper.getMainLooper());
public UdpBiz(){
try {
mServerAddress = InetAddress.getByName(serverIp);
mSocket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
//观察者模式
public interface OnMsgReturnedListener{//返回消息监听
void onMsgReturned(String msg);
void onError(Exception ex);
}
public void sendMsg(final String msg, final OnMsgReturnedListener listener){
new Thread(){
@Override
public void run() {
byte[] clientMsgBytes = msg.getBytes();
DatagramPacket clientPacket =
new DatagramPacket(clientMsgBytes,clientMsgBytes.length,mServerAddress,mServerPort);
try {
mSocket.send(clientPacket);//如果异步方法调用通过listener回调出去
//如果同步方法调用 不用再方法中直接try catch掉,最好是throws出去 让调用者处理
//接收数据
byte[] buf = new byte[1024];
DatagramPacket serverMsgPacket = new DatagramPacket(buf,buf.length);
mSocket.receive(serverMsgPacket);
final String serverMsg = new String(serverMsgPacket.getData(),0,serverMsgPacket.getLength());
uiHandler.post(new Runnable() {
@Override
public void run() {
listener.onMsgReturned(serverMsg);
}
});
} catch (final Exception e) {
uiHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e);
}
});
}
}
}.start();
}
public void onDestroy(){
if(mSocket!=null){
mSocket.close();//某些api 一个对象已经close过了 会throw IllegalException 需要注意 有时要做强保护
//此api是直接return所以无须强保
}
}
}
activity
package com.example.socket;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.sokcet.Biz.UdpBiz;
public class MainActivity extends AppCompatActivity {
private TextView tv_result;
private Button btn_send;
private EditText et_input;
private UdpBiz udpBiz = new UdpBiz();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
tv_result = findViewById(R.id.tv_result);
btn_send = findViewById(R.id.btn_send);
et_input = findViewById(R.id.et_input);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = et_input.getText().toString();
if(TextUtils.isEmpty(msg)){
return;
}
udpBiz.sendMsg(msg, new UdpBiz.OnMsgReturnedListener() {
@Override
public void onMsgReturned(String msg) {
tv_result.append("servermsg-- "+msg+"\n");
}
@Override
public void onError(Exception ex) {
tv_result.setText(ex.getMessage());
}
});
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
udpBiz.onDestroy();//释放资源
}
}
结果