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协议,它是由:FTP、SMTP、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服务端
我们创建一个服务端,需要以下步骤
-
创建服务器 -
指定服务器端口 -
获取客户端链接 -
接收数据 -
回应客户端 -
关闭链接
表示服务端的类是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客户端
我们在客户端上需要:
-
向服务端发起链接 -
然后把数据传给服务端 -
接收来自服务端的回应 -
关闭链接
而表示客户端的类是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();
}
}
效果展示
注意需要先让服务器运行起来,再运行客户端
客户端:
在这里插入图片描述服务器端:
在这里插入图片描述- 点赞
- 收藏
- 关注作者
评论(0)