网络编程(计算机网络相关)-程序员宅基地

技术标签: java  java开发  服务器  

网络编程概述

        网络编程是什么

        就是用来实现 网络互连的不同计算机上 运行的程序间可以进行 数据交换 。

        网络编程的目的:

        直接或间接地 通过网络协议 与其它计算机实现 数据交换,进行通讯。

        网络编程中有两个主要的问题:

        如何准确地定位网络上一台或多台主机,定位主机上的特定的应用

        找到主机后如何可靠高效地进行数据传输

网络通信要素概述(三要素)

        IP、端口号

        网络通信协议

 

 

通信要素1: IP和端口号

IP 地址:InetAddress

        1.唯一的标识 Internet 上的计算机(通信实体)

        2.本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost

        3.有两种分类方式:

        IP地址分类方式1:IPV4 和 IPV6

                IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已 经用尽。以点分十进制表示,如192.168.0.1

                IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

        IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)。192.168. 开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用

        特点:不易记忆

端口号

        1.标识正在计算机上运行的进程(程序),不同的进程有不同的端口号

        2.被规定为一个 16 位的整数 0~65535。

        3.端口分类:

        公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口 80,FTP占用端口21,Telnet占用端口23)

        注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占 用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。

        动态/私有端口:49152~65535。

        4.端口号与IP地址的组合得出一个网络套接字:Socket。

 

通信要素2:网络协议

        1.网络通信协议

        计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

        2.通信协议分层的思想

        计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩 解压缩,差错控制,流量控制,路由控制,如何实现如此复杂的网络协议呢?

        在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常 用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与 再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

TCP/IP协议簇

1.传输层协议中有两个非常重要的协议:

        传输控制协议TCP(Transmission Control Protocol)

        用户数据报协议UDP(User Datagram Protocol)。

2.TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。

3.IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。

4。TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即 物理链路层、IP层、传输层和应用层。

 

 

 

Socket

1.利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。

2.网络上具有唯一标识IP地址和端口号组合在一起才能构成唯一能识别标识符套接字

3.通信的两端都要有Socket,是两台机器间通信的端点。

4.网络通信其实就是Socket间的通信。

5.Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。

6.一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。

7.Socket分类:

        流套接字(stream socket):使用TCP提供可依赖的字节流服务

        数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务

 

TCP网络编程

基于Socket的TCP编程

 

客户端Socket的工作过程包含以下四个基本的步骤:

        1.创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。

        2.打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输

        3.按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息 (但不能读取自己放入线路的信息),通过输出流将信息写入线程。

        4.关闭 Socket:断开客户端到服务器的连接,释放线路

客户端创建Socket对象

1.客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。Socket的构造器是:

2. 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求

Socket s = new Socket(“192.168.40.165”,9999);
OutputStream out = s.getOutputStream();
out.write(" hello".getBytes());
s.close();

服务器程序的工作过程包含以下四个基本的步骤:

        1.调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口 上。用于监听客户端的请求。

        2.调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。

        3.调用该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。

        4.关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。

服务器建立 ServerSocket 对象

        ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口 中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字 连接的ServerSocket对象。

        所谓“接收”客户的套接字请求,就是accept()方法会返回一个 Socket 对象

ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();

例题:用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?

/** Server端程序
 * @author xiaocui
 * @date 2022年08月05日 13:01
 */
public class Server {

    private ServerSocket ss;
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;

    public Server() {

        try {
            ss = new ServerSocket(1000);
            while (true){
                socket = ss.accept();
                String RemoteIP = socket.getInetAddress().getHostAddress();
                String RemotePort = ":" + socket.getLocalPort();
                System.out.println("A client come in!IP:" + RemoteIP + RemotePort);

                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line = in.readLine();
                System.out.println("Client send is" + line);
                out = new PrintWriter(socket.getOutputStream(), true);
                out.println("Your Message Received!");
                out.close();
                in.close();
                socket.close();

            }

        } catch (IOException e) {
            out.println("wrong");
        }
    }

    public static void main(String[] args) {
        new Server();
    }

}
/**Client端程序
 * @author xiaocui
 * @date 2022年08月05日 14:09
 */
public class Client {

    Socket socket;
    BufferedReader in;
    PrintWriter out;

    public Client() {
        try {
            System.out.println("Try to Connect to 127.0.0.1:10000");
            socket = new Socket("127.0.0.1", 10000);
            System.out.println("The Server Connected!");
            System.out.println("Please enter some Character:");
            BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(socket.getOutputStream(), true);
            out.println(line.readLine());
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(in.readLine());
            out.close();
            in.close();
            socket.close();
        } catch (IOException e) {
            out.println("Wrong");
        }
    }

    public static void main(String[] args) {
        new Client();
    }

}

 

客户端—服务端:

客户端: 自定义 、浏览器;服务端:自定义 、Tomcat服务器

        客户端-服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定 服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号 是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户 端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实 现面向连接的会话。

        类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。Socket是客户端 和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输 通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。

UDP网络编程

 

 发送端:

DatagramSocket ds = null;
try {
    ds = new DatagramSocket();
    byte[] by = "hello,atguigu.com".getBytes();
    DatagramPacket dp = new DatagramPacket(by, 0, by.length, 
    InetAddress.getByName("127.0.0.1"), 10000);
    ds.send(dp);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (ds != null)
        ds.close();
}

接收端:

        在接收端,要指定监听的端口。

DatagramSocket ds = null;
try {
    ds = new DatagramSocket(10000);
    byte[] by = new byte[1024];
    DatagramPacket dp = new DatagramPacket(by, by.length);
    ds.receive(dp);
    String str = new String(dp.getData(), 0, dp.getLength());
    System.out.println(str + "--" + dp.getAddress());
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (ds != null)
        ds.close();
}

URL编程

1.URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。

2.它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。

3.通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。

4.URL的基本结构由5部分组成:

 

 

 

         类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示 Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之 间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abcfh123802/article/details/126169255

智能推荐

ONVIF协议--ONVIF WS-Discovery (设备发现协议)-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏20次。ONVIF Discovery 协议介绍

HDOJ1172解题报告【暴力】-程序员宅基地

文章浏览阅读54次。题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1172题目概述:  对于每组数据,先给出一个n,然后n行每行一个四位数,然后两个数b,c表示与答案有b个数相同,c个数在同一位置上,对于所有的n个给出的四位数,如果推出的答案唯一则输出,否则输出“Not sure”(不含引号)大致思路:  首先我想的是用搜索。穷极一生之力写了100+行的...

数据库视图作用?什么时候用视图?_哪种情况更适合建立视图-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏37次。刚工作时候第一次看到接触到视图,感觉很不能理解,我当时就在想为什么要用视图呢?明明可以关联表查出来数据的,为什么又单独创建一个视图查询数据呢?工作久了我有以下几点心得分享给大家.1.安全性 因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,视图中数据是根据基表的更新而更新,用户不可以更改/删除视图。2.方便,简化数据操作当我们业务需求要查出多张表的数据,这时我们可能会关联多张表查询处理.如..._哪种情况更适合建立视图

Anaconda介绍及常用命令总结_anaconda csdn-程序员宅基地

文章浏览阅读643次,点赞4次,收藏6次。Anaconda的安装及基本概念Anaconda中通过conda进行python包的管理Anaconda中通过conda进行虚拟环境的管理为形成良好的编程习惯,为每一个项目单独创建一个虚拟环境对开发来说至关重要。这一习惯即使对非数据data项目(如Web App)也能十分有效的帮助管理开发环境。_anaconda csdn

第25回 准确报告软件缺陷_描述缺陷发生的可能性的是-程序员宅基地

文章浏览阅读6.4k次。 软件缺陷的描述是是软件缺陷报告的基础部分,也是测试人员就一个软件问题与开发小组交流的最初且最好的机会。一个好的描述,需要使用简单的、准确的、专业的语言来抓住缺陷的本质。否则,它就会使信息含糊不清,可能会误导开发人员。准确报告软件缺陷是非常重要的,因为: 清晰准确的软件缺陷描述可以减少软件缺陷从开发人员返回的数量 提高软件缺陷修复的速度,使每一个小组能够有效的_描述缺陷发生的可能性的是

signature=77a5bffa142f96901b9bf201769a775d,tibot/yarn.lock at 79fb61111b881d3a2fc858eadda5bf250a2475...-程序员宅基地

文章浏览阅读6.6k次。# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.# yarn lockfile v1accepts@~1.3.5, accepts@~1.3.7:version "1.3.7"resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc..._hsck735.cc

随便推点

idea卸载Material Theme UI后有些配置无法恢复的解决_idea material theme ui 卸载-程序员宅基地

文章浏览阅读1.3k次。idea卸载Material Theme UI后,git配色无法恢复。解决办法:一个一个地点回来(restore default)。_idea material theme ui 卸载

android 清楚app缓存数据,android 获取其他应用程序的缓存大小以及清理应用缓存...-程序员宅基地

文章浏览阅读1k次。最近在做appStore时,涉及到一个第三方app下载视频后将车机存储撑爆的问题,从而影响到我们车机自带的app使用,问题很是严重,于是就需要提供缓存清理以及垃圾清理的功能,当用户使用第三方app时,存储空间达到一定量的时候会提示用户去清理,否则不允许使用第三方app。缓存获取获取各个应用程序的缓存大小,可以通过使用PackageManager.getPackageSizeInfo方法来获取,但是..._android packageinstaller缓存数据很大

vue给对象动态添加属性和值_vue3 键值对动态添加与获取-程序员宅基地

文章浏览阅读1.8w次。vue给对象动态添加属性和值一、背景介绍:在vue中请求接口中,一个请求方法可能对应后台两个请求接口,所以请求参数就会有所不同。需要我们先设置共同的参数,然后根据条件动态添加参数属性。二、案例let that = this; let params = { "type":that.addQueTab..._vue3 键值对动态添加与获取

解决keil:error C132: : not in formal parameter list等等突然出现很多很多报错_main.c(34): error c132: 'lcd1602_busycheck': not i-程序员宅基地

文章浏览阅读3.1w次,点赞55次,收藏16次。http://www.51hei.com/bbs/dpj-25003-1.html这里参考了这个帖子,在我身上发生的问题就是我在声明一个函数的时候忘记加分号了,会报错特别多奇奇怪怪的东西,吓死我了。解决办法就是加上分号就好了..._main.c(34): error c132: 'lcd1602_busycheck': not in formal parameter list

android adjustresize 设置大小,Android中adjustResize失效的解决办法之一-程序员宅基地

文章浏览阅读1.2k次。今天帮助哥们解决了一个比较蛋疼的问题,就是在有的情况下会出现设置activity的windowSoftInputMode="adjustResize"时,会失效的情况。历尽千辛万苦,终于在stackflow上找到解决方法。在activity的根布局上添加fitsSystemWindows="true".然后adjustResize就可以成功的起作用了。但是在这种情况下,你的titlebar会下移s..._adjustresize

消息自定义_c++ lersult-程序员宅基地

文章浏览阅读139次。// 消息自定义// 1、#defien WM_MSG WM_USER// 2、.h文件中添加事件: afx_msg LERSULT OnFun(WPARAM wparam, LPARAM lparam);// 3、宏定义消息路由: ON_MESSAGE(WM_MSG, OnFun)_c++ lersult