Java 全面掌握网络编程篇

 更新时间:2021年10月13日 14:45:08   作者:青素i  
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节

计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。包括局域网(intranet)和广域网(internet)

网络模型

网络模型一般是指
○ OSI(Open System Interconnection开放系统互连)参考模型
○ TCP/IP参考模型
网络编程 就是用来实现网络互联的不同计算机上运行的程序间可以进行数据交换。
计算机网络之间以何种规则进行通信,就是网络模型研究问题

在这里插入图片描述

客户机服务器模式(Client/Server)

●为了实现两台计算机的通信,必须要用一个网络线路连接两台计算机。
● 服务器(Server)是指提供信息的计算机或程序
●客户机(Client)是指请求信息的计算机或程序
●网络用于连接服务器与客户机,实现两者相互通信。

在这里插入图片描述

TCP/IP的概念和实现

TCP/IP:Transmission Control Protocol/Internet Protocol的简写。TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

TCP三次握手(Three-way handshake)

所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立连接。
❤ 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)。
❤ 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
❤ 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ETABLISHED(TCP连接成功)状态,完成三次握手。
❤ 完成三次握手,客户端与服务器开始传送数据

在这里插入图片描述

TCP编程

套接字(Socket)是使用TCP提供了两台计算机之间的通信机制。
客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对
Socket 对象的写入和读取来进行通信。
► 服务端:
创建服务端对象,监听一个端口

ServerSocket ss = new ServerSocket(100);

获取客户端对象

Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();

► 客户端:
创建客户端socket服务,把ip和端口作为地址传进构造函数

Socket s = new Socket("localhost",100);

UDP的概念和实现

UDP(User Datagram Protocol):UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
用户数据包协议(UDP)是网络信息传输的另一种形式,基于UDP的通信与基于TCP的通信不同,UDP的信息传递更快,但不提供可靠的保证。

UDP编程

发送端:
建立udp服务,发送端没有指定端口,会自动分配一个端口
DatagramSocket ds = new DatagramSocket();
定义数据内容,并将数据封装成包
byte[] bt = “hello,udp,我来了”.getBytes();
把要发送的数据和ip、port封装到数据包里
DatagramPacket db = new
DatagramPacket(bt,bt.length,InetAddress.getByName(“192.168.1.105”),10000);
通过udp的socket服务中的功能完成数据包的发送 ds.send(db);
接收端:定义socket服务,监听端口
DatagramSocket ds = new DatagramSocket(10000);
预先定义好一个数据包,用于存储接收到的数据
byte[] bt = new byte[1024];
创建数据包对象,用于接收数据
DatagramPacket dp = new
DatagramPacket(bt,bt.length);
使用socket服务的receive方法将接受到的数据存储到数据包中
ds.receive(dp);
通过数据包对象,获取数据包内容
byte[] data = dp.getData();
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();

TCP和UDP的区别

TCP:
1,面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接时间。
2,TCP传输数据无大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。
3,TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。
UDP:
1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
3,UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行数据传输。

聊天室

服务器处理线程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class ServerTask  implements Runnable{
	
	
	private Socket socket;

	
	public ServerTask(Socket socket) {
		// TODO 自动生成的构造函数存根
		this.socket = socket;
	
	}
	
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		
		//建立通信后所执行的内容
		
		System.out.println("欢迎【"+socket.getRemoteSocketAddress().toString()+"】进入聊天室");
		
		//构建读取缓冲
		BufferedReader br =null;
		//http响应写入
		PrintWriter pw = null;
		
		try {
			
			//获取客户端输入的信息 字节流缓冲成字符流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String msg;
			
			while((msg=br.readLine()) != null) {
				msg = "【"+socket.getRemoteSocketAddress().toString()+"】说"+msg;
				
				//输出客户端信息
				System.out.println(msg);
				
				//服务器接收到客户端的消息发送消息给客户端
				Scanner scanner = new Scanner(System.in);
				System.out.println("请输入要发送的信息!");
				
				
				pw = new PrintWriter(socket.getOutputStream(),true);
				pw.println("服务器说:"+scanner.nextLine());
				pw.flush();				
			}	
		}catch (SocketException e) {
			// TODO: handle exception
			System.out.println(socket.getRemoteSocketAddress().toString()+"退出聊天室!");
		}	
		catch (Exception e) {
			// TODO: handle exception
		}
		
	}

}

客户端处理线程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;


public class ClientTask  implements Runnable{

	private Socket socket;
	
	
	
	public ClientTask(Socket socket) {
		// TODO 自动生成的构造函数存根
		this.socket = socket;
	}
	
	
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		
		try {
				while(true) {
					Scanner scanner = new Scanner(System.in);
					System.out.println("请输入要发送的信息");
					//消息发送到服务器
					
					PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
					
					//br.readLine()读取的消息发送到服务器
					pw.println(scanner.nextLine());

					
					//读取服务器发送的消息
					BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					System.out.println(br.readLine());

				}		
		}
		catch (Exception e) {
			// TODO: handle exception
		}
		
		
		
	}

	
}

服务器

import java.net.ServerSocket;
import java.net.Socket;

import com.qingsu.chat.Task.ServerTask;

public class ChatServer {

	
	public static void main(String[] args) {
		try {
			
			//创建服务端对象 监听一个窗口
			ServerSocket serverSocket = new ServerSocket(10622);
			System.out.println("服务器创建成功!端口号"+10622);
			
			//阻塞 直到有链接返回
			while(true) {
				Socket socket = serverSocket.accept();//获取客户端对象
				
				//启动一个线程处理该链接
				
				Thread thread = new Thread(new ServerTask(socket));
				thread.start();
				
			}		
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

客户端

import java.net.Socket;

import com.qingsu.chat.Task.ClientTask;

public class ChatClient {
	
	
	public static void main(String[] args) {
		try {
			
			//创建客户端socket服务,把ip和端口作为地址传进构造函数
			Socket socket = new Socket("127.0.0.1",10622);
			
			//启动客户机线程处理
			Thread thread = new Thread(new ClientTask(socket));		
			thread.start();
		
			
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

效果

在这里插入图片描述

到此这篇关于Java 全面掌握网络编程篇的文章就介绍到这了,更多相关Java 网络编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java计算百分比的各种方法总结

    Java计算百分比的各种方法总结

    这篇文章主要给大家介绍了关于Java计算百分比的各种方法,要计算百分比并保留两位小数,首先需要明确计算公式和java语言的数学计算方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Java数据结构及算法实例:朴素字符匹配 Brute Force

    Java数据结构及算法实例:朴素字符匹配 Brute Force

    这篇文章主要介绍了Java数据结构及算法实例:朴素字符匹配 Brute Force,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • java实现sunday算法示例分享

    java实现sunday算法示例分享

    Sunday算法的思想和BM算法中的坏字符思想非常类似。差别只是在于Sunday算法在匹配失败之后,是取目标串中当前和Pattern字符串对应的部分后面一个位置的字符来做坏字符匹配,写了个小例子来实现以下这个算法
    2014-01-01
  • Java网络编程实现的简单端口扫描器示例

    Java网络编程实现的简单端口扫描器示例

    这篇文章主要介绍了Java网络编程实现的简单端口扫描器,涉及Java网络编程Socket组建、swing组建及多线程相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • 简单易用的Spring Boot邮件发送demo

    简单易用的Spring Boot邮件发送demo

    本文将介绍如何使用Spring Boot发送邮件,我们将演示如何配置SMTP邮件服务器,创建一个邮件模板,以及如何使用JavaMailSender发送邮件,我们还将介绍如何测试我们的邮件发送代码
    2023-12-12
  • java实现protocol传输的客户端和服务端的示例代码

    java实现protocol传输的客户端和服务端的示例代码

    本文主要介绍了java实现protocol传输的客户端和服务端的示例代码,基于TCP协议的客户端和服务端,包括了基本的连接、消息传递和关闭连接的操作,感兴趣的可以了解一下
    2024-07-07
  • 使用socket进行服务端与客户端传文件的方法

    使用socket进行服务端与客户端传文件的方法

    这篇文章主要介绍了使用socket进行服务端与客户端传文件的方法,需要的朋友可以参考下
    2017-08-08
  • Windows下 IDEA编译调试 hive2.3.9的过程解析

    Windows下 IDEA编译调试 hive2.3.9的过程解析

    这篇文章主要介绍了Windows下 IDEA编译调试 hive2.3.9的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • IDEA Ui设计器JFormDesigner 永久激活插件+注册机(亲测一直在用)

    IDEA Ui设计器JFormDesigner 永久激活插件+注册机(亲测一直在用)

    这篇文章主要介绍了IDEA Ui设计器JFormDesigner 永久激活----插件+注册机 自己一直在用的版本和注册机,非常不错,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Runtime.getRuntime().exec 路径包含空格的解决

    Runtime.getRuntime().exec 路径包含空格的解决

    这篇文章主要介绍了Runtime.getRuntime().exec 路径包含空格的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论