java基础(21)(网络通讯协议,UDP通信程序,TCP通信程序,综合案例)

软件结构

    C/S结构
    Client/Server结构,客户端和服务器(下载的APP软件等)
    B/S结构
    Browser/Server结构,浏览器和服务器(谷歌,淘宝,京东等)

通信协议
TCP/IP协议

传输控制协议/因特网互联协议,是Internet最基本,最广泛的协议
定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。


四层模型:

    链路层:用于定义物理传输通道,通常是对某些网络连接设备的驱动协议
    网络层:tcp/ip协议的核心,主要用于传输的数据进行分组,将分组数据发送到目标计算机或者网络
    传输层:主要使用网络程序进行通信,在进行网络通信时,可以采用tcp协议或者udp协议
    应用层:主要负责应用程序的协议,http协议、ftp协议

UDP协议

用户数据报协议,面向无连接通信协议,数据的发送端与接收端不建立逻辑连接,消耗资源小,通信效率高,常用语音频视频等普通数据,面向无连接性,不能保证数据的完整性,数据被限制在64kb以内。


TCP协议

传输控制协议,面向连接的通信,数据传输之前,在发送端和接收端建立逻辑连接,再传输数据,在tcp连接中必须声明客户端和服务器端,有客户端向服务器端发出连接请求,每次连接的创建需要经过三次握手,比较安全。


三次握手

第一次握手,客户端向服务器端发送请,等待服务器确认
第二次握手,服务器端向客户端发送一个响应,通知服务端收到了连接请求
第三次握手,客户端再次向服务器端发送确认信息,确认连接。
完成三次握手建立连接后,客户端和服务器端就可以开始进行数据传输了。


网络编程三要素

协议(上面已介绍过);IP地址和端口号


IP地址

指互联网协议地址俗称ip
ip地址分类:
ipv4 32位的二进制数,通常被分为4个字节
ipv6 采用128位地址长度,没16个字节一组,分成8组16进制数
常用命令有:
常看本机ip地址:ipconfig/ipconfigall
检查网络是否连通:ping 空格 ip地址
特殊的IP地址:本机地址:127.0.0.1 localhost


端口号

用两个字节表示的整数,它的取值范围是0-65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。


InetAddress类

该类用于封装一个ip地址,并提供了一系列与ip地址相关的方法


常用方法

    public static InetAddress getLocalHost()返回本地主机。
    public static InetAddress getByName(String host)根据ip和主机名获取InetAddress
    public String getHostAddress()获取ip地址
    public String getHostName()获取主机名


    代码演示:

public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
//        获取本地主机
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost.getHostName());
        System.out.println(localHost.getHostAddress());
//        根据主机名获取InetAddress
        InetAddress inetAddress = InetAddress.getByName("PC201501241736");
        System.out.println(inetAddress);
//        获取ip地址
        System.out.println(inetAddress.getHostAddress());
//        获取主机名
        System.out.println(inetAddress.getHostName());

    }
}

UDP通信
UDP发送数据

    UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念

DatagramSocket类

    DatagramSocket类作为基于UDP协议的Socket

DatagramSocket构造方法

    DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
    DatagramPacket(byte[] buf,int len,InetAddress add,int port)创建数据包,发送长度为len的数据包到指定主机的指定端口

DatagramSocket常用方法

    void send(DatagramPacket p)发送数据报包
    void close()关闭数据报套接字
    void receive(DatagramPacket p)从此套接字接受数据报包

DatagramSocket使用步骤

    创建发送端的Socket对象(DatagramSocket)
    创建数据,并打包数据
    调用DatagramSocket对象的方法发送数据
    关闭发送端


    代码演示:

public class SendDataDemo {
    public static void main(String[] args) throws IOException {
        /**
         * 1. 创建发送端的Socket对象(DatagramSocket)
         * 2. 创建数据,并打包数据
         * 3. 调用DatagramSocket对象的方法发送数据
         * 4. 关闭发送端
         */
        DatagramSocket ds = new DatagramSocket();
        byte[] bytes = "hello world".getBytes();
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("172.16.16.94"),10001);
        ds.send(dp);
        ds.close();
    }
}

UDP接收数据
DatagramPacket类构造

    DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包

DatagramPacket类方法

    byte[] getData()返回数据缓冲区
    int getLength()返回要发送的数据的长度或接收的数据的长度

接收数据步骤

    创建接收端的socket对象(DatagramSocket)
    调用一个数据包,用于接受数据
    调用DatagramSocket对象的方法就收数据
    解析数据包,并把信息在控制台显示
    关闭接收端


    代码演示:

public class ReceiveDataDemo {
    public static void main(String[] args) throws IOException {
        /**
         * 1. 创建接收端的socket对象(DatagramSocket)
         * 2. 调用一个数据包,用于接受数据
         * 3. 调用DatagramSocket对象的方法就收数据
         * 4. 解析数据包,并把信息在控制台显示
         * 5. 关闭接收端
         */
        DatagramSocket ds = new DatagramSocket(12345);
        while (true){
            byte [] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
        }
    }
}

TCP通信
TCP发送数据

    Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。

Socket类

    Java为客户端提供了Socket类,用于创建客户端发送数据

Socket类构造

    Socket(InetAddress address,int port)创建流套接字并将其连接到指定IP指定端口号
    Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号

Socket类方法

    InputStream getInputStream()返回此套接字的输入流
    OutputStream getOutputStream()返回此套接字的输出流


    代码实现

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        //Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
        Socket socket = new Socket("172.16.16.94", 10001);
        //获取输出流,写数据
        OutputStream os = socket.getOutputStream();
        os.write("hello world".getBytes());
        //释放资源
        socket.close();
    }
}

TCP接收数据

    Java为服务器端提供了ServerSocket类,用于接收数据和处理数据

ServerSocket类构造

    ServletSocket(int port)创建绑定到指定端口的服务器套接字

ServerSocket类方法

    Socket accept()监听要连接到此的套接字并接受它

     代码实现

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器的socket对象(ServerSocket)
        //ServerSocket(int port)创建绑定到指定端口号的服务器套接字
        ServerSocket serverSocket = new ServerSocket(10001);
        //Socket accept()侦听要连接的套接字并接收它
        Socket accept = serverSocket.accept();
        //获取输入流,读数据,并将数据显示在控制台
        InputStream is = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        String data = new String(bytes, 0, len);
        System.out.println("数据是:"+data);
        //释放资源
        accept.close();
        serverSocket.close();
    }
}

TCP通信案例
案例需求

    客户端:发送数据
    服务器:接收消息后并反馈

需求分析

    客户端创建对象,使用输出流输出数据
    服务端创建对象,使用输入流接收数据
    服务端使用输出流给出反馈数据
    客户端使用输入流接收返回数据

代码实现
服务端代码

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象(ServerSocket)
        ServerSocket serverSocket = new ServerSocket(10001);
        //侦听客户端连接,返回一个Socket对象
        Socket socket = serverSocket.accept();
        //获取输入流,读数据,并把数据显示在控制台
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        String data = new String(bytes, 0, len);
        System.out.println("服务器接受的数据是:"+data);

        //反馈
        OutputStream os = socket.getOutputStream();
        os.write("已受到数据".getBytes());
        //释放资源
        serverSocket.close();
    }
}

客户端代码

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象(Socket)
        Socket socket = new Socket("127.0.0.1", 10001);
        //获取输出流,写数据
        OutputStream os = socket.getOutputStream();
        os.write("发送到服务器的数据".getBytes());

        //接收服务端反馈的数据
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        String data = new String(bytes, 0, len);
        System.out.println("客户端接受的数据:"+data);
        //释放资源
        socket.close();
    }
}

聊天室案例
接收端代码

public class UDPReceive {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket并指定端口号
        DatagramSocket ds = new DatagramSocket(10001);
        byte[] bytes = new byte[1024];
        while (true){
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            byte[] data = dp.getData();
            int length = dp.getLength();
            InetAddress address = dp.getAddress();
            System.out.println("发送者:"+address.getHostAddress());
            System.out.println(new String(data,0,length));
        }
        //释放资源
        //ds.close();
    }
}

发送端代码

public class UDPSend {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket();
        //从控制台输入聊天信息
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("请输入聊天内容:");
            String message = scanner.nextLine();
            byte[] bytes = message.getBytes();
            //发送数据
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 10001);
            ds.send(dp);
        }
        //释放资源
        //ds.close();
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是一本介绍利用Visual C++进行网络通信程序开发的书籍,书中精选了大量网络实例,涵盖了本地计算机网络编程,局域网网络通信编程,IE编程,网络通信协议编程,串口通信编程,代理服务器编程和高级网络通信编程。每个工程实例都提供了完整的源代码,读者可以很容易地根据需要进行二次开发。本书适合进行网络通信开发的人员阅读,同时也可以作为科研单位,高校相关专业人员的参考书籍。<br><br>目录介绍<br>第1章 Visual C++网络通信编程基础 1<br>1.1 Winsock1.1编程技术 1<br>1.1.1 Winsock的基本概念 1<br>1.1.2 Winsock的编程特点 2<br>1.1.3 Winsock基本的API 2<br>1.1.4 Winsock的异步模式 7<br>1.1.5 面向连接协议和无连接协议 20<br>1.2 Winsock 2.0编程技术 21<br>1.2.1 Winsock 2.0技术说明 21<br>1.2.2 Winsock 2.0新增函数 25<br>1.2.3 Winsock网络程序——聊天室 26<br>1.3 CAsyncSocket编程技术 38<br>1.3.1 CAsyncSocket类的组成 38<br>1.3.2 CAsyncSocket编程模型 39<br>1.4 CSocket编程技术 41<br>1.4.1 CSocket类的组成 42<br>1.4.2 CSocket应用实例——聊天室 43<br>1.5 WinInet编程技术 52<br><br>第2章 本地计算机网络编程 57<br>2.1 获取计算机的名称和IP地址 57<br>2.2 获取计算机的子网掩码 60<br>2.3 获取计算机的DNS设置 62<br>2.4 获取计算机的网卡地址 63<br>2.5 获取计算机安装的协议 65<br>2.6 获取计算机提供的服务 67<br>2.7 获取计算机的所有网络资源 69<br>2.8 修改本地计算机的网络设置 70<br>2.9 获取计算机TCP/IP的所有信息 74<br><br>第3章 局域网网络通信编程实例 79<br>3.1 获取网上邻居 79<br>3.1.1 实现原理 80<br>3.1.2 实例实现 83<br>3.2 IP地址和主机名之间的转换 87<br>3.2.1 实现原理 87<br>3.2.2 实例实现 89<br>3.3 映射网络驱动器 93<br>3.3.1 实现原理 93<br>3.3.2 实例实现 95<br>3.4 局域网消息发送程序Net Send 97<br>3.4.1 实现原理 98<br>3.4.2 实例实现 101<br>3.5 获取局域网内其他计算机的信息 103<br><br>第4章 IE编程实例 111<br>4.1 简单的浏览器的实现 111<br>4.1.1 实现原理 111<br>4.1.2 实例实现 112<br>4.2 删除IE相关历史记录 116<br>4.2.1 实现原理 116<br>4.2.2 实例实现 117<br>4.3 将应用程序加入到IE工具栏 121<br>4.3.1 实现原理 122<br>4.3.2 实例实现 123<br>4.4 超级链接的实现 127<br>4.4.1 实现原理 127<br>4.4.2 实例实现 128<br>4.5 禁止IE的弹出窗口 132<br>4.5.1 实现原理 132<br>4.5.2 实例实现 133<br>4.6 禁止浏览某些网站 139<br>4.6.1 实现原理 139<br>4.6.2 实例实现 139<br>4.7 IE收藏夹 142<br>4.7.1 实现原理 142<br>4.7.2 实例实现 142<br>4.8 设置桌面快捷方式和活动桌面 145<br>4.8.1 实现原理 145<br>4.8.2 实例实现 146<br><br>第5章 基本网络编程实例 150<br>5.1 点对点文件传输 150<br>5.2 端口扫描程序 155<br>5.2.1 实现原理 155<br>5.2.2 实例实现 155<br>5.3 Finger编程 161<br>5.3.1 实现原理 162<br>5.3.2 实例实现 164<br>5.4 Sniff编程 166<br>5.4.1 实现原理 166<br>5.4.2 实例实现 167<br>5.5 Internet文件下载 178<br>5.5.1 实现原理 178<br>5.5.2 实例实现 180<br><br>第6章 网络通信协议编程实例 184<br>6.1 FTP协议 185<br>6.1.1 FTP工作原理 185<br>6.1.2 FTP数据表示 186<br>6.1.3 FTP命令 187<br>6.1.4 FTP应答 192<br>6.1.5 FTP客户端实例方法 194<br>6.1.6 FTP客户端实例实现 201<br>6.2 SMTP协议 221<br>6.2.1 SMTP会话 221<br>6.2.2 SMTP信件 225<br>6.2.3 SMTP客户端实例方法 232<br>6.2.4 SMTP客户端实例实现 233<br>6.3 POP3协议 259<br>6.3.1 POP3会话 259<br>6.3.2 POP3信件 264<br>6.3.3 POP3客户端实例方法 268<br>6.3.4 POP3客户端实例实现 268<br>6.4 ICMP协议 287<br>6.4.1 ICMP报文格式 287<br>6.4.2 ICMP时间戳请求与应答 289<br>6.4.3 Ping程序的实现 291<br>6.4.4 TraceRoute程序的实现 300<br>6.5 Telnet协议 308<br>6.5.1 Telnet协议 308<br>6.5.2 NVT ASCII字符集 309<br>6.5.3 协商选项 309<br>6.5.4 BBS实例实现 310<br>6.6 HTTP协议 323<br>6.6.1 HTTP会话 324<br>6.6.2 HTTP数据 329<br>6.6.3 HTTP客户端程序的实现 329<br>6.6.4 HTTP服务器实例实现 343<br><br>第7章 Modem/串口通信编程实例 353<br>7.1 AT命令 353<br>7.1.1 Modem状态 353<br>7.1.2 AT命令 354<br>7.1.3 Modem返回信息码 354<br>7.2 MSCOMM控件编程实例 355<br>7.2.1 实现原理 355<br>7.2.2 实例实现 356<br>7.3 串口通信API编程实例 360<br>7.3.1 打开和关闭串口 360<br>7.3.2 串口配置 362<br>7.3.3 串口属性设置 365<br>7.3.4 缓冲区控制 366<br>7.3.5 串口读写 367<br>7.3.6 通信事件 369<br>7.3.7 设备控制命令 370<br>7.3.8 实例实现 370<br><br>第8章 代理服务器编程实例 378<br>8.1 Socks 5协议编程 379<br>8.1.1 实例原理 386<br>8.1.2 实例实现 388<br>8.2 HTTP代理服务器实例 397<br>8.2.1 主框架代码分析 397<br>8.2.2 代理类CProxyServer的实现 399<br><br>第9章 高级实例解析 409<br>9.1 串口通信高级编程实例 409<br>9.1.1 主程序结构和流程 409<br>9.1.2 实例演示 409<br>9.1.3 实例原理 410<br>9.1.4 实例设计 414<br>9.1.5 代码分析 414<br>9.2 网络流量监控实例 425<br>9.2.1 主程序结构和流程 426<br>9.2.2 实例演示 426<br>9.2.3 实例原理 426<br>9.2.4 实例设计 428<br>9.2.5 代码分析 429<br>9.3 网站下载实例 438<br>9.3.1 主程序结构和流程 438<br>9.3.2 实例演示 438<br>9.3.3 实例原理 439<br>9.3.4 实例设计 441<br>9.3.5 代码分析 442<br>9.4 网络五子棋实例 458<br>9.4.1 主程序结构和流程 458<br>9.4.2 实例演示 458<br>9.4.3 实例原理 459<br>9.4.4 实例设计 459<br>9.4.5 代码分析 459<br>9.5 语音聊天实例 466<br>9.5.1 主程序结构和流程 467<br>9.5.2 实例演示 467<br>9.5.3 实例原理 468<br>9.5.4 实例设计 472<br>9.5.5 代码分析 473<br>9.6 远程控制实例 482<br>9.6.1 主程序结构和流程 482<br>9.6.2 实例演示 483<br>9.6.3 实例原理 484<br>9.6.4 实例设计 485<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值