Java网络编程

目录

1.网络编程

2.软件架构

2.1.网路通信协议

2.1.1.UDP协议

2.1.2.TCP协议

2.2.UDP的三种通信方式

2.3.TCP通信程序


1.网络编程

        计算机跟计算机之间通过网络进行数据传输。

-------------------------------------------------------------------------

网络分层

仅作了解,百度或请点这里


2.软件架构

  • B/S 架构:浏览器/服务器

    • 优点:
      • 不需要开发客户端,只需要页面    +服务端
      • 用户不需要下载,打开浏览器就能使用(eg:淘宝,京东等) 
    • 缺点:
      • 如果应用过大,用户体验受到影响
  • C/S 架构:客户端/服务器
    • 优点:
      • 画面精美额,体验较好
    • 缺点:
      • 需要开发客户端+服务端
      • 用户需要下载和更新

-------------------------------------------------------------------------

网络编程三要素:

  • IP
    • 设备在网络中的地址,是唯一的标识。
  • 端口号
    • 应用程序在设备中唯一的标识。
    • 由两个字节表示的整数,取值范围 :0 ~ 65535
  • 协议
    • 数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。

-------------------------------------------------------------------------

  • IP地址
    • 唯一标识网络上的每一台计算机
  • IP地址的组成
    • 32位,由4个8位二进制数组成
  • IP地址 = 网络地址 + 主机地址
    • 网络地址:标识计算机或网络设备所在的网段
    • 主机地址:标识特定主机或网络设备

IPv4  vs  IPv6:

IPv4:最多只有2^32次方个ip,目前已经使用完

     当前解决方案:利用局域网IP解决IP不够的问题

IPv6:为了解决IPv4不够用而出现,最多有2^128次方个ip。

-------------------------------------------------------------------------

IP地址的配置和检测

  • 查看IP地址,检测网络是否畅通
    • 查看本机的IP地址
      • ipconfig 
    • 测试网络是否通畅
      • ping 目标地址

特殊的IP地址:127.0.0.1,也可以是 localhost,指本机IP。

-------------------------------------------------------------------------

2.1.网路通信协议

        计算机网络中,连接和通信的规则被称为网络通信协议。

2.1.1.UDP协议

  • 用户数据报协议
  • UDP是面向无连接通信协议
    • 速度快,有大小限制,一次最多发送64K,数据不安全,易丢失数据

2.1.2.TCP协议

  • 传输控制协议TCP
  • TCP协议是面向连接的通信协议
    • 速度慢,没有大小限制,数据安全

TCP

UDP

是否连接

面向连接

面向非连接

传输可靠性

可靠

不可靠

速度

-------------------------------------------------------------------------

2.2.UDP的三种通信方式

  • 单播
  • 组播
    • 组播地址:224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0.255为预留的组播地址
  • 广播
    • 广播地址:255.255.255.255

-------------------------------------------------------------------------

2.3.TCP通信程序

        在通信两端建立一个 Socket 对象,通信之间要保证连接已经建立,通过 Socket 产生IO流来进行网络通信。

 步骤:

客户端(Socket):

  1. 创建客户端 Socket 对象(Socket)与指定服务器连接

    Socket socket = new Socket("localhost", 5000);

  2. 获取输出流对象,写数据

    OutputStream os = socket.getOutputStream();

  3. 释放资源

    void close()

示例:

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

//客户端
public class LoginClient {

	public static void main(String[] args) {

		try {
			// 1.创建客户端Socket
			Socket socket = new Socket("localhost", 5000);
			// 2.创建输出流对象
			OutputStream os = socket.getOutputStream();
			// 3.通过输出流将登录信息发送请求给服务器
			String loginInfo = "用户名:admin;密码:123456";
			os.write(loginInfo.getBytes());
			
			//通过输入流接收服务器返回给客户的相应
			socket.shutdownOutput();
			InputStream is =socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while ((reply = br.readLine())!=null) {
				System.out.println("服务器响应说:"+reply);
			}
			
			//4.关闭流及Socket
			br.close();
			is.close();
			os.close();
			socket.close();
		} catch (IOException e) {

			e.printStackTrace();
		}
	}

}

服务器端(ServerSocket):

  1. 创建服务器端Socket 对象(ServerSocket)

    ServerSocket serverSocket = new ServerSocket(5000);

  2. 监听客户端连接,返回一个Socket对象

    Socket socket = serverSocket.accept();

  3. 获取输入流,读数据,并把数据显示在控制台

    InputStream is =socket.getInputStream();

  4. 释放资源

    void close()

示例:

//服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class LoginServer {

	public static void main(String[] args) {
		try {
			//1.创建服务器端Socker对象
			ServerSocket serverSocket = new ServerSocket(5000);
			//2.使用accept()方法来监听接收用户请求,创建链接
			Socket socket = serverSocket.accept();
			//3.通过输入流获取用户请求的信息
			InputStream is =socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String info;
			while ((info = br.readLine())!= null) {
				System.out.println("客户端说:"+info);
			}
			
			//通过输出流给客户端一个响应
			OutputStream os = socket.getOutputStream();
			String reply = "欢迎登录";
			os.write(reply.getBytes());
	
			
			//关闭相应的流和Socket
			os.close();
			br.close();
			is.close();
			socket.close();
			serverSocket.close();
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

运行结果:

客户端

服务器

----------------------------------------------------------------------------------

TCP三次握手和四次挥手

三次握手:

  • 第一次握手:客户端向服务器端发出连接请求,等待服务器确认

  • 第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求

  • 第三次握手:客户端再次向服务器端发送确认信息,确认连接

 四次挥手:

2.4.UDP通信程序

基于UDP协议的socket网络编程步骤

  1. 利用 DatagramPacket 对象封装数据包
  2. 利用 DatagramSocket 发送数据包
  3. 利用 DatagramSocket 接收数据包
  4. 利用 DatagramPacket 处理数据包

示例:简单聊天室

发送端:

package dh09.UDPDemo;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

//简单聊天室
public class SendMessage {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		try {
			//1.创建DatagramSocket对象
			DatagramSocket ds = new DatagramSocket();
			//2.打包数据
			
			while (true) {
				System.out.print("请输入您要说的话:");
				String str = sc.next();
				if ("886".equals(str)) {
					break;
				}
				
				byte[] b = str.getBytes();
				InetAddress address = InetAddress.getByName("localhost");
				
				int port = 10086;
				
				DatagramPacket dPacket =new DatagramPacket(b, b.length,address,port);
				
				//3.发送数据
				ds.send(dPacket);
			}
		
		
			
			//4.释放资源
			ds.close();
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		

	}

}

接收端:

package dh09.UDPDemo;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ReceiveMessage {

	public static void main(String[] args) {

		try {
			// 1.创建对象DatagramSocket的对象
			DatagramSocket ds = new DatagramSocket(10086);

			// 2.接收数据包
			byte[] b = new byte[1024];
			DatagramPacket dPacket = new DatagramPacket(b, b.length);

			while (true) {

				ds.receive(dPacket);

				// 3.解析数据包
				byte[] data = dPacket.getData();
				int len = dPacket.getLength();
				String ip = dPacket.getAddress().getHostAddress();
				String name = dPacket.getAddress().getHostName();

				// 4.打印数据
				System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));

			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

posted @   愚人钊啊  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示