CSDN21天学习挑战赛——网络编程(02)


活动地址:CSDN21天学习挑战赛

*学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

TCP和UDP概述

传输层通常以TCP和UDP协议来控制端点到端点的通信。

TCP UDP
协议名称 传输控制协议
是否连接 面向连接的协议。数据传输必须要建立连接。
是否可靠 可靠的协议。确保接收方完全正确地获取发送方所发送的全部数据。
数据大小 传输数据大小不受限制。一旦连接建立,双方可以按统一的格式传输大的数据
数据传输 IO流
形象比喻 打电话

UDP通信

UDP协议是一种对等通信的实现,发送方只需要知道接收方的IP和Port,就可以直接向它发送数据,不需要事先连接。每个程序都可以作为服务器,也可以作为客户端。
UDP通信的Socket使用DatagramSocket类实现,数据报使用DatagramPacket类实现。
在UDP协议中,接收和发送数据报的DatagramPacket的创建方式是不同的。

发送数据报

构造函数:public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
四个参数依次表示:输出数据、数据长度、目的地址(InetAddress)、接收方端口。

接收数据报

构造函数:public DatagramPacket(byte[] buf, int length)
两个参数依次表示:接收数据的缓冲区、接收到的字节数。

DatagramPacket常用方法

方法 介绍
InetAddress getAddress() 得到发送方的IP地址
int getPort() 得到发送方的端口号
byte[] getData() 返回接收缓冲区,这是一个byte[]。注意:接收数据不一定就会填满这个缓冲区
int getLength() 接收字节的真实大小。通常用于从byte[]中提取出有效数据

DatagramSocket常用方法

方法 介绍
void receive(DatagramPacket p) 接收数据报
void send(DatagramPacket p) 发送数据报
void close() 关闭Socket

UDP通信示例:
发送方:

package com.cn.SenderReceive;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Sender {
    public static void main(String[] args) {
        try {
            int port=10000;
            DatagramSocket datagramSocket=new DatagramSocket();
            String str="\n云想衣裳花想容\n春分拂槛露华浓\n若非群玉山头见\n会向瑶台月下逢";
            byte[] bytes = str.getBytes();
            int length = bytes.length;
            InetAddress localHost = InetAddress.getLocalHost();
            DatagramPacket datagramPacket=new DatagramPacket(bytes,length,localHost,port);
            datagramSocket.send(datagramPacket);
            datagramSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收方:

package com.cn.SenderReceive;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Cilent {
    public static void main(String[] args) {
        int port=10000;
        try {
            DatagramSocket datagramSocket=new DatagramSocket(port);
            byte[] bytes=new byte[1024*5];
            int length = bytes.length;
            DatagramPacket datagramPacket=new DatagramPacket(bytes,length);

            datagramSocket.receive(datagramPacket);

            byte[] data = datagramPacket.getData();
            int length1 = datagramPacket.getLength();
            String s=new String(data,0,length1);
            InetAddress address = datagramPacket.getAddress();
            System.out.println(address+"发来的消息:"+s);

            datagramSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

TCP通信

TCP协议用来控制两个网络设备之间的点对点通信,两端设备按作用分为客户端和服务端。
因为TCP通信两端的行为是不同的,所以在客户端使用Socket类实现通信,而服务器使用ServerSocket实现通信。

TCP通信示例
客户端:

package com.cn.SocketServer;

import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        int port=10000;
        try {
            InetAddress localHost = InetAddress.getLocalHost();
            Socket socket=new Socket(localHost,port);
            OutputStream outputStream = socket.getOutputStream();
            String str="\n云想衣裳花想容\n春分拂槛露华浓\n若非群玉山头见\n会向瑶台月下逢";
            byte[] bytes = str.getBytes();
            int length = bytes.length;
            outputStream.write(bytes,0,length);

            outputStream.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

服务器:

package com.cn.SocketServer;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        int port=10000;

        try {
            ServerSocket socket=new ServerSocket(port);
            Socket accept = socket.accept();
            InputStream inputStream = accept.getInputStream();
            byte[] bytes=new byte[1024];
            int length = inputStream.read(bytes);
            String s=new String(bytes,0,length);
            String hostAddress = accept.getInetAddress().getHostAddress();
            System.out.println(hostAddress+"发来消息:"+s);

            inputStream.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(Java,网络,学习,udp)