Android网络编程之UDP/TCP

Android开发之UDP/TCP

TCP协议:传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP协议:用户数据报协议(User Datagram Protocol,UDP)是一种面向无连接的传输层协议,提供面向事物的简单不可靠信息传送服务。

UDP:

UDP客户端

  • 调用DatagramSocket() 创建一个数据包套接字
  • 调用DatagramPacket(byte[] buf ,int length ,InetAddress address,int port),建立要发送的UDP包
  • 调用DatagramSocket 类的send()发送UDP包

    示例代码如下:

       DatagramSocket socket;
       DatagramPacket packet;
           try {
                 //初始化DatagramSocket对象
                    socket = new DatagramSocket();
                 //自定义端口号,应大于1023
                    int port = 4567;
                   //初始化InetAddress对象
                    InetAddress address = InetAddress.getByName("10.10.218.203");
                    //定义需要发送的信息
                    String content = "Hello world!";
                    //将信息转换为字节类型的数据
                    byte [] data = content.getBytes();
                  //初始化DatagramPacket对象
                    packet = new DatagramPacket(data,data.length,address,port);
                    //发送
                    socket.send(packet);
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    if(socket != null ){
                    //关闭数据包套接字
                        socket.close();
                    }
                }
 //PS:作为客户端向服务器端发送数据时,需要知道服务器端的ip地址和端口号。而此时服务器端不需要知道客户端的ip地址和端口号。

UDP服务器端

  • 调用DatagramSocket(int port ) 创建一个数据包套接字,并绑定端口
  • 调用DatagramPacket(byte [] buf, int length) 使用字节数组接收UDP包
  • 调用DatagramSocket类的receive(),接收UDP包。

    示例代码如下

DatagramSocket socket;
DatagramPacket packet;
   try {     //初始化DatagramSocket对象
             socket = new DatagramSocket(3456);
             //字节数组用于接收数据,客户端发送的数据不能超过100字节(按需自定义大小)
             byte [] buf = new byte[100];
             //初始化一个DatagramPacket对象
             packet = new DatagramPacket(buf, buf.length);
             //准备接收数据
             socket.receive(packet);
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                //关闭socket对象
                    if(socket != null ){
                        socket.close();
                    }
                }
            }


//PS:作为服务器端不需要知道客户端的ip地址,相反,客户端需要知道服务器端的ip地址和服务器端指定某一端口号,客户端向该端口号发送数据时服务器端便能够接收到。

TCP:

TCP客户端

  • 调用Socket() 创建一个套接字
  • 调用Socket类的getOutputStream() 和 getInputStream()方法获取输出和输入流
  • 关闭套接字

实例代码如下:

 Socket socket;
 InetAddress address = null;
        try {
            address = InetAddress.getByName("10.10.218.203");
            int port = 2342;
            //初始化Socket
            socket = new Socket(address,port);
            //获得输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //获取输入内容
            String inMsg = in.readLine();
            //生成输出流
            BufferedWriter out= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //向输出流写入内容
            out.write("data from client");
            //发送
            out.flush();
            //关闭连接
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
//PS:作为客户端需要知道服务器端的IP地址和端口号.

TCP服务器端

  • 调用ServerSocket(int port)创建一个ServerSocket,并指定端口
  • 调用accept(),监听连接请求,如果客户端请求连接则接收连接,返回套接字
  • 调用Socket类的getOutputStream()和getInputStream()获得输出流和输入流。

实例代码如下:

ServerSocket serverSocket;
Socket socket;

        try {
        //初始化ServerSocket对象
            serverSocket= new ServerSocket(8765);
          //监听连接请求
            socket = serverSocket.accept();
            //获得输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String inMsg = in.readLine();
            //获得输出流
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //向输出流写入内容
            out.write("data from tcp Server");
            //发送
            out.flush();
            //关闭
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
        //判断是否初始化ServerSocket对象,如果初始化则关闭
         if(serverSocket != null){
         try{
         serverSocket.close();
         }catch(IOException e){
         e.printStackTrace();
         }
      }
   }
//PS:与客户端不同的是作为服务器端需要监听连接请求。

你可能感兴趣的:(Android网络编程)