Java网络编程

举报
布小禅 发表于 2021/11/27 20:27:06 2021/11/27
【摘要】 Java网络编程

Java网络编程

网络编程是编写运行在网络中不同设备中的程序。例如(QQ,微信等)。

通过网络编程,人们可以实现网络中不同设备的通讯。

1.软件构成

软件的构成有两种方式

  • C/S结构
  • B/S结构

C/S结构是client(客户端)/server(服务器)结构,常见的有QQ,微信等桌面客户端

B/S结构是browser(浏览器)/server(服务器)结构,常见的是百度,哔哩哔哩,CSDN等各大网站

2.网络编程三要素

通讯协议,IP地址,端口号

3.通讯协议

网络之间的通讯需要遵循一定的网络通讯协议。

通讯协议就是让网络中的每台计算机都使用一样的规则,这样才能互相通讯。

协议就像我们平时说的语言

在中国(局域网)说汉语(中国的通讯协议就是汉语)

但是到了国际上,我说汉语,你说日语,当然无法交流

因此就需要一个统一的语言,也就是英语(协议)来规定

3.1TCP/IP协议

而提起通讯协议,就不得不说TCP/IP协议,它是网络中使用最多,最广泛的协议,当然,它并不是单单指TCP协议和IP协议,它是由:FTPSMTP、TCP、UDP、IP等协议构成,之所以称为TCP/IP

协议是因为它们两个最具代表性。

3.2两种通讯协议

一为UDP协议,一为TCP协议

  • UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。

  • TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

说白了UDP就是用于视频通话,打电话,看直播的时候,而TCP则是用在传输文件的时候。因为UDP并不安全,它在传输数据时会丢失一些数据包,而在你视频电话时,遇到这种情况时,无非就是卡了一下罢了,并不会太影响,而UDP的速率比TCP 的速率要快;不过TCP 的安全性更高,它通常在传输文件时使用,它并不会丢失数据包,但是速率上较之UDP慢。

TCP之所以会慢是因为TCP每次都需要经过三次握手,即客户端向服务端发送请求;服务端回应请求;客户端确认请求这三个过程。

4.IP地址

IP地址是计算机的唯一标识,用于被别的计算机识别,然后连接,通讯。

就相当于我们用的身份证,代表着我们的身份。

当然因为他叫地址,我们也可以理解为我们每个人的地址,而这个理解相对于身份证号来说,对端口号的;接更为方便一些。

而IP地址分为IPv4和IPv6

IPv4有四个字节,但是却是使用十进制来表示的a.b.c.d每个大小取值的范围是0~255,范围大致为2**32(每个字节有8个二进制构成)也就是4294967296个,而这个值对于地球上的计算机来说,是有些不够用的,因此就出现了IPv6

IPv6有六个字节,取值范围远大于IPv4,足足有281474976710656个,号称可以给地球上的每个沙子配上ip,IPv6的出现,解决了IPv4地址不够用的问题

5.端口号

我们计算机上每个软件工作时,操作系统都会给软件分配一个端口号,因为计算机只有一个IP地址,而计算机上有许许多多的软件,当我们用一个软件通讯时,虽然可以通过IP地址找到目标计算机,但是却无法找到目标计算机上对应的软件,此时就需要端口号了,这个端口号就是我们的软件能够找到目标计算机的软件的凭证。

端口号由两个字节组成,取值范围是0~65536,不过1024之前的端口我们无法使用,因为操作系统已经将其分配给了系统软件,而端口号是无法相同的。

利用地址来理解,你就会发现端口号只不过就是这样罢了:

IP地址是计算机的小区地址,而端口号是门牌号,我给你的小区送了一封信,如果没有门牌号的话,物流就无法知道这封信到底是寄给谁的。

6.Java网络编程

Java网络编程是使用Java代码编写运行在网络中的多台设备的程序

Java网络编程被封装在java.net包中

而表示客户端的类是java.net.Socket

表示服务端的类是java.net.ServerSocket

而我们需要创建一个服务端和一个客户端,然后进行数据的传输

6.1服务端

我们创建一个服务端,需要以下步骤

  1. 创建服务器
  2. 指定服务器端口
  3. 获取客户端链接
  4. 接收数据
  5. 回应客户端
  6. 关闭链接

表示服务端的类是java.net.ServerSocket

1. 使用之前,我们应该先导包,而考虑到后面会使用io包里的流和net包里的客户端,所以直接全导入

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

2. 我们通过ServerSocket类的带端口参数的构造方法来实例化,创建一个服务端

ServerSocket server = new ServerSocket(8888); //1.创建一个服务器对象,绑定端口位8888

3. 获取客户端链接

Socket socket = server.accept(); //2.获取链接

4. 使用getInputStream()方法接收数据

InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);

5. 输出数据

System.out.println(new String(bytes,0,len));

6. 使用getOutputStream()方法给客户端回应

OutputStream os = lj.getOutputStream();
String name = "服务器:";
String nr = String.format("%s你好啊,客户端!", name);
os.write(nr.getBytes());

7. 关闭连接

server.close();
lj.close();

服务端完整代码:

package Java进阶.netBc;

import java.io.*;
import java.net.*;

/**
 * 1.创建一个服务器对象,绑定端口
 * 2.获取链接
 * 3.获取数据
 * 4.回应数据
 * 5.释放资源
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888); //1.创建一个服务器对象,绑定端口
        Socket lj = server.accept(); //2.获取链接
        InputStream is = lj.getInputStream(); //3.获取数据
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        OutputStream os = lj.getOutputStream();
        String name = "服务器:";
        String nr = String.format("%s你好啊,客户端!", name);
        os.write(nr.getBytes());
        server.close();
        lj.close();
    }
}

6.2客户端

我们在客户端上需要:

  1. 向服务端发起链接
  2. 然后把数据传给服务端
  3. 接收来自服务端的回应
  4. 关闭链接

而表示客户端的类是java.net.Socket

1. 导包

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

2. 发起链接

Socket socket = new Socket("127.0.0.1", 8888);

3. 给服务器端传数据

OutputStream os = socket.getOutputStream();
String nr = String.format("%s你好,服务器",name);
os.write(nr.getBytes());

4. 接收服务器端的响应

InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));

5. 关闭链接

socket.close();

全部代码

package Java进阶.netBc;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 1.创建Socket对象
 * 2.传数据
 * 3.接收响应
 * 4.关闭
 */
public class TCPClint {
    public static void main(String[] args) throws IOException {
        String name = "客户端:";
        Socket socket = new Socket("127.0.0.1", 8888);
        OutputStream os = socket.getOutputStream();
        String nr = String.format("%s你好,服务器",name);
        os.write(nr.getBytes());
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        socket.close();
    }
}

效果展示

注意需要先让服务器运行起来,再运行客户端

客户端:

在这里插入图片描述在这里插入图片描述

服务器端:

在这里插入图片描述在这里插入图片描述
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200