UDP案例

简单 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();//释放资源
    }
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值