网络基础编程

简介: 网络基础编程

要进行具体的网络编程,需要写一个应用程序,让这个程序实现网络通信,则需要调用传输层所提供的API.

一:UDP和TCP协议特点对比

在进行两个协议特点对比之前,我们先来了解一部分的基础知识

a:有连接   无连接

   有连接:两者或者多着建立连接(以打电话为例,A给B打电话,A先必须按下电话号码,要等B按下接听才算建立连接,但如果B不在或者B不想接听,那么,此时,就相当于没有建立连接)

   无连接:两者或者多着没有建立连接(以发微信/短信为例,A给B发微信,直接发过去,不需要B再进行后续操作)

 在计算机中,一个客户端可以对应多个服务器,一个服务器可以对应多个客户端,同时,客户端和服务器之间存在着连接.

                                                       小tips:连接与链接的区别

链接(Link):快捷方式

连接(Connection):一个保存着另一个的信息.

b:可靠传输   不可靠传输

c:面向字节流   面向数据报

d:全双工

e:总结

二:UDP的Socket API

 在学习API之前,我们先来知悉UDP中的两个核心类(DatagramSocket  DatagramPacket)

a:DatagramSocket类

b:DatagramPacket类
DatagramPacket(Byte[] buf,int length) 通过创建byte[]作为数组存储的空间,接收收据
DatagramPacket(byte[]buf,int offset,int length,Socket(Address address) Ip和端口号,发送数据
InetAddress getAddress()
int getPort()
byte[] get Data() 获取UDP的载荷部分(完整的应用层数据报)
c:回显服务器

  回显服务器:客户端发啥,服务器返回啥(echo server).

服务器代码:

public class UdpEchoServer {
    private DatagramSocket socket=null;//实现网络通信,离不开网卡,即socket对象
    //创建服务器的端口号,手动指定
    public UdpEchoServer(int port) throws SocketException {
        socket=new DatagramSocket(port);
    }
    //使用start方法启动服务器
    public  void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //反复的,长期的执行针对客户端请求处理的逻辑,一个服务器,在运行过程中
            //1:读取请求,并解析,通过Socket对象来调用receive来接收,并进行解析
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            String request=new String(requestPacket.getData(),0, requestPacket.getLength());
            //2:根据请求,计算响应
            String response=process(request);
            //3:把响应返回给客户端
            //此时需要告知网卡,要发的内容是啥,发给谁
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
            socket.send(responsePacket);
            //记录日志,打印IP地址和端口号
            System.out.printf("[%s:%d] req: %s,resp %s\n",requestPacket.getAddress().toString(),requestPacket
                    .getPort(),request,response);
        }
    }
    //2:根据请求,计算响应,由于是回显程序,响应内容和请求完全一样
    public  String process(String request){
        return request;
    }
    public static void main(String[] args) throws IOException {
      UdpEchoServer udpEchoServer=new UdpEchoServer(1000);
      udpEchoServer.start();
    }
}

客户端代码

public class UdpEchoClient {
    //创建socket对象
    DatagramSocket  socket=null;
    private String serverIp;//代表服务器的IP
    private int serverPort;//代表服务器的端口号
    //构造方法,ip代表服务器的ip,port代表服务器的端口号
    public UdpEchoClient(String ip,int port) throws SocketException {
        serverIp=ip;
        serverPort=port;
        //创建socket对象,不再指定端口,让系统自动分配一个空闲端口
        socket=new DatagramSocket();
    }
    //启动客户端,让客户端反复从控制台读取用户输入的内容,把这个内容构造成UDP请求,发给服务器,再读取服务器的UDP返回UDP的响应
    //最后再显示在客户端的屏幕上
    public  void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
        System.out.println("客户端启动!");
        while(true){
            //1.从控制台读取用户输入的内容
            System.out.println("->");//命令提示符
            String request=scanner.next();
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);
            //2将数据报发送给服务器
            socket.send(requestPacket);
            //3.读取服务器的响应,并解析出响应内容
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            String response=new String(responsePacket.getData(),0,responsePacket.getLength());
            //4.显示到屏幕上
            System.out.println(response);
        }
    }
    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",9090);
        udpEchoClient.start();
    }
}

运行结果:

对于代码进行分析

相关文章
|
7月前
|
Python
Python网络编程基础(Socket编程) 使用try-except处理网络错误
【4月更文挑战第11天】在网络编程中,错误处理和异常管理是非常重要的部分。网络操作经常因为各种原因而失败,比如网络断开、服务器无响应、地址不正确等。因此,学会如何使用Python的异常处理机制来捕获和处理这些错误,是编写健壮的网络应用的关键。
|
7月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
监控 安全
公司上网监控:Mercury 在网络监控高级逻辑编程中的应用
在数字化办公环境中,公司对员工上网行为的监控至关重要。Mercury 作为一种强大的编程工具,展示了在公司上网监控领域的独特优势。本文介绍了使用 Mercury 实现网络连接监听、数据解析和日志记录的功能,帮助公司确保信息安全和工作效率。
97 51
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
32 1
|
2月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
30 0
|
4月前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
5月前
|
监控 Python
单位网络监控软件中的PostScript图形编程
PostScript是一种强大的页面描述语言,广泛应用于图形编程和打印控制。在单位网络监控软件中,利用PostScript可以实现复杂的图形绘制和文本处理。本文将通过几个具体的代码示例,介绍如何在PostScript中进行图形编程,并讨论如何将监控到的数据自动提交到网站。
73 10
|
5月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
67 2
|
4月前
|
安全 Java 网络安全
云计算时代下的网络安全挑战与应对策略Java编程中的异常处理:从基础到高级
在云服务不断深入各行各业的今天,网络安全问题也随之凸显。本文将探讨云计算环境下的安全风险,并提出相应的防护措施,以期为相关行业提供参考和指导。 在Java的世界里,异常处理是代码健壮性的守护神。它不仅保护程序免于意外崩溃,还提供了一种优雅的方式来响应错误。本文将带你领略异常处理的艺术,从简单的try-catch语句到复杂的自定义异常和finally块的神秘力量,我们将一起探索如何让Java程序在面对不确定性时,依然能够优雅地起舞。
|
5月前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
【7月更文挑战第27天】在网络编程的广阔天地中,Socket编程常被视为一道难关。但用Python这把钥匙,我们可以轻松入门。Socket作为网络通信的基石,在Python中通过`socket`模块封装了底层细节,简化了开发过程。以下是一个基本的TCP服务器与客户端的示例,展示了如何建立连接、收发数据及关闭连接。为了应对实际场景中的并发需求,我们还可以借助多线程技术来提升服务器处理能力。掌握了这些基础知识后,你将逐步揭开网络编程的神秘面纱,踏上编程高手之路!
63 0