网络的相关概念
网络通信-IP
IP地址(Internet Protocol):唯一标识网络上的每一台计算机
IP地址的组成:32位,由4个8位二进制数组成

二进制变成十进制方法:位数数值乘以2的位数次方,最大到255
IP地址 = 网络地址 +主机地址
网络地址:标识计算机或网络设备所在的网段
主机地址:标识特定主机或网络设备
IP地址的配置和检测:
-
查看IP地址,检测网络是否畅通
-
查看本机的IP地址:ipconfig
-
测试网络是否通畅:ping (再加上)目标IP地址
【1. 开始里面直接输入cmd;2. 打开dos系统;3. 输入代码】
DNS域名解析:Domain Name System,域名系统
为了好访问,好记忆。通过DNS
网络服务器:
通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机
B/S:浏览器服务器端的服务程序【好处:服务器端自己升级就行了】
C/S:客户端服务器端的服务程序
网络通信协议:
为在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
【数据在网络中传输是很复杂的】
HTTP协议:超文本传输协议,互联网应用最广泛的。
FTP协议:文件传输协议。
SMTP协议:简单邮件传输协议。
TCP协议(Transmission Control Protocol 传输控制协议):面向连接的、可靠的、基于字节流的传输通信协议。
UDP协议(User Datagram Protocol 用户数据报协议):无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接,效率很快。
Socket:
通信链路的端点就被称为“套接字”(英文名Socket);是提供给应用程序的接口

【Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制】
Socket分类
- 流式套接字(SOCK_ STREAM)【面向连接、可靠的数据传输服务(对应服务是TCP链接)】
- 数据报式套接字(SOCK_ DGRAM)【无连接服务(数据报似的,基于UDP)更高效】
原始式套接字(SOCK_ RAW)
java.net包:
Socket
ServerSocket
DatagramPacket
DatagramSocket
InetAddress
……
网络通信/传输协议
- 网络通信协议
为在网络种不同的计算机之间进行通信而建立的规则、标准或与约定的集合 - TCP协议
面向连接的、可靠的、基于字节流的传输通信协议 - UDP协议
无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接
Socket编程
套接字使用TCP提供了两台计算机之间的通信协议。客户端创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建有个Socket对象。客户端和服务器就可以通过对Socket对象的写入和读取来进行通信。
java.net.Socket类代表了一个套接字,并且java.net.ServerSocket类为服务器提供了一种监听客户端,并与他们建立连接的机制。
两台计算机之间使用套接字建立TCP连接的步骤如下:
1.服务器实例化一个ServerSocket对象,表示通过服务器上的端口通信;
2.服务器调用ServerSocket类的accept()方法一直等待,直到客户端连接到服务器上给定的端口;
3.服务器等待客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接;
4.Socket类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个Socket对象与服务器进行通信;在服务器端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket。
5. 连接建立后,通过使用I/O流进行通信,每一个socket都有一个输入流和一个输出流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
客户端
public class LogicServicer {
public static void main(String[] args) {
try {
//接收客户端请求
//创建一个Socket
ServerSocket serverSocket = new ServerSocket(5000);
//使用accept()侦听并接收到此ServerSocket的连接
Socket socket = serverSocket.accept();//侦听到之前都是阻塞的
//获得输入流,获得用户的请求
//数据流输入
InputStream is = socket.getInputStream();
// BufferedReader读取字符流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;
// BufferedReader的方法可以一行一行的读
while((info = br.readLine())!=null){
System.out.println("客户端:"+info);
}
//给客户端一个响应
String reply = "欢迎登陆";
//通过输出流将响应发送回给客户端
OutputStream os = socket.getOutputStream();
os.write(reply.getBytes());
//释放相应资源
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
} } }
服务端
public class LogicClient {
public static void main(String[] args) {
//创建一个客户端的Socket
try {
Socket socket = new Socket("localhost",5000);
//通过输出流发送请求
//直接输出数据流
String info = "用户名:樱桃小丸子;密码:123456";
OutputStream os = socket.getOutputStream();
//打散成数据数组
byte[] infos = info.getBytes();
os.write(infos);
//关闭输出流,这是一个半关闭
socket.shutdownOutput();
//通过输入流接收服务器给我的响应
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply;
while((reply = br.readLine())!=null){
System.out.println("服务器:"+reply);
}
//释放资源
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
基于UDP协议的Socket网络编程步骤
利用 DatagramPacket 对象封装数据报
利用 DatagramSocket 发送数据报
利用 DatagramSocket 接收数据报
利用 DatagramPacket 处理数据报
DatagramPacket类
封装了数据报的数据、数据长度、目标地址和目标端口
DatagramSocket类
接收和发送DatagramPacket对象封装好的数据报
【两个类都在java.net包里】
例子:
礼物—数据(字符串)
包裹—DatagramPacket
快递点—DatagramSocket
寄礼物—send()
收礼物—receive()
public class LogicServicer {
public static void main(String[] args) {
byte[] infos = new byte[1024];
DatagramPacket dp = new DatagramPacket(infos,infos.length);
//快递点
DatagramSocket socket=null;
try {
socket = new DatagramSocket(5000);
//在快递点取礼物
socket.receive(dp);
//拆礼物
String info = new String(dp.getData(),0,dp.getData().length);
System.out.println("客户端说:"+info);
//给客户端一个响应
String reply ="一件羽绒服";
byte[] reply2 = reply.getBytes();
//客户端地址
SocketAddress sa = dp.getSocketAddress();
//打开一个包裹
DatagramPacket dp1 = new DatagramPacket(reply2,reply2.length,sa);
//寄出去
socket.send(dp1);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
socket.close();
} } }
基于UDP的Socket通信,客户端:
public class LogicClient {
public static void main(String[] args) {
//买礼物
String info="心形巧克力!";
byte[] infos = info.getBytes();
//对方地址和邮编(端口号)
InetAddress ia;
//快递点
DatagramSocket socket = null;
try {
ia = InetAddress.getByName("localhost");
//包裹包装礼物
DatagramPacket dp = new DatagramPacket(infos, infos.length, ia, 5000);
socket = new DatagramSocket();
//通过快递点往外寄出礼物
try {
socket.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
//接收服务器的响应
byte[] replys = new byte[1024];
DatagramPacket dp1 = new DatagramPacket(replys,replys.length);
socket.receive(dp1);
String reply = new String(dp1.getData(),0,dp.getData().length);
System.out.println("服务器的响应:"+reply);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
socket.close();
} } }
本文深入探讨网络通信原理,包括IP地址、DNS解析、TCP/IP协议等核心概念,同时详解Socket编程,涵盖TCP和UDP协议下的客户端与服务器通信流程及代码实现。
2466

被折叠的 条评论
为什么被折叠?



