Android基于UDP协议的Socket通信详细例子实现(一)(记录学习)

这里对Socket的TCP UDP进行一下总结 以及一个UDP的demo

TCP UDP的区别:(考点)
是否需要客户端与服务端建立连接后才能进行数据传输

详细的流程:

TCP流程->

传输前先开服务器,accept等待用户接入,获得客户端socket 进行IO操作 ->socket.getInputStream or socket.getOutputStream

UDP流程->

以数据报作为传输载体,在进行传输时将数据定义为数据报(Datagram)在数据报中指明要到达的主机地址和端口号 将数据以数据报形式发送
ok ,最后以一个demo结束本章节 希望能够对正在观看的小伙伴有所帮助 详细的实现请看注释(超级详细)
eclipse服务端

public class UDPService {
	
	//Socket UDP通信服务段实现的流程
	//Step 1:创建DatagramSocket,指定端口号
	//Step 2:创建DatagramPacket
	//Step 3:接收客户端发送的数据信息
	//Step 4:读取数据
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		
		   /*
           * 服务端接收客户端数据
           */
			//1.创建DatagramSocket,指定端口号
			DatagramSocket socket = new DatagramSocket(12306);
			
			// 2.创建数据报,用于接收客户端发送的数据
	        byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小
	        DatagramPacket packet = new DatagramPacket(data, data.length);
	        
	        // 3.接收客户端发送的数据
	        System.out.println("****服务器端已经启动,等待客户端发送数据");
	        socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞
		    
	        //4.读取数据
	        String info = new String(data, 0, packet.getLength());
	        System.out.println("我是服务器,客户端说:" + info);
	        
	        
	        /*
	         * 向客户端响应数据
	         */
	        // 1.定义客户端的地址、端口号、数据
	        InetAddress address = packet.getAddress();
	        int port = packet.getPort();
	        byte[] data2 = "欢迎您!".getBytes();
	        // 2.创建数据报,包含响应的数据信息
	        DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
	        // 3.响应客户端
	        socket.send(packet2);
	        // 4.关闭资源
	        socket.close();

	}

}

这是的意思是 首先对于客户端的数据进行读取 然后在向客户端进行数据的响应

android 客户端
主要的逻辑

public class UdpClientThread extends Thread {
    //IP地址
    private String mAddress;
    //端口
    private int port;
    //发送内容

    private Handler mHandler;

    public UdpClientThread(Handler handler, String address, int port) {
        this.mHandler = handler;
        this.mAddress = address;
        this.port = port;

    }

    @Override
    public void run() {
        super.run();
        sendSocket();
    }


        private void sendSocket() {

            try {
                /*******************发送数据***********************/
                /*
                 * 向服务器端发送数据
                 */
                // 1.定义服务器的地址、端口号、数据
                InetAddress address = InetAddress.getByName(mAddress);

                byte[] data = "用户名:admin;密码:123".getBytes();
                // 2.创建数据报,包含发送的数据信息
                DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
                // 3.创建DatagramSocket对象
                DatagramSocket socket = new DatagramSocket();
                // 4.向服务器端发送数据报
                socket.send(packet);

                /*******************接收数据***********************/

                /*
                 * 接收服务器端响应的数据
                 */
                // 1.创建数据报,用于接收服务器端响应的数据
                byte[] data2 = new byte[1024];
                DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
                // 2.接收服务器响应的数据
                socket.receive(packet2);
                // 3.读取数据
//                String reply = new String(data2, 0, packet2.getLength());
//                Log.i("statewow","我是客户端,服务器说:" + reply);

                sendMsg(0,new String(data2, 0, data2.length));
                // 4.关闭资源
                socket.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    private void sendMsg(int i, Object s) {
        Message msg = new Message();
        msg.what = i;
        msg.obj = s;
        mHandler.sendMessage(msg);
    }


}

Activity:

public class UDPSpcket extends AppCompatActivity {
    private String mAddress = "192.168.30.83";
    private int port = 12306;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_udpspcket);
        initView();
    }

    private void initView() {
        UdpClientThread mThread = new UdpClientThread(mHandler, mAddress, port);
        mThread.start();
    }

    /**
     * Handler
     */
    private Handler mHandler = new Handler(Looper.myLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0: {
                    String content = (String) msg.obj;
                    Log.i("dagejiuwo","@"+content);
                    break;
                }
            }
        }
    };
}


发布了43 篇原创文章 · 获赞 60 · 访问量 6748

猜你喜欢

转载自blog.csdn.net/yuhang01/article/details/103275650
今日推荐