JavaSE基础——网络编程
1、计算机网络
计算机网络就是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路来连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
2、网络编程
2.1、网络模型
OSI 模型
2.2、网络编程三要素
(1)IP地址: InetAddress:网络设备的标识,不容易记忆,可用主机名。
(2)端口号: 用于标识进程的逻辑地址,不同进程有不同的标识。
(3)传输协议: 通讯的规则常见协议:TCP、UDP。
2.3、网络编程之IP
(1)IP概述: IP就是给每个连接在Internet上的主机分配的一个32bit地址。
(2)IP地址的组成: IP地址 = 网络地址+主机地址
A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码
(3)IP地址分类:
A类1.0.0.1---127.255.255.254(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) (2)127.X.X.X是保留地址,用做循环测试用的。B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址D类 224.0.0.1---239.255.255.254 E类 240.0.0.1---247.255.255.254
(4)特殊地址:
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1 DOS命令 ipconfig:查看本机IP地址xxx.xxx.xxx.255 广播地址
代码演示:
import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo {public static void main(String[] args) {try {//获取本机地址的方式InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress2 = InetAddress.getByName("localhost");System.out.println(inetAddress2);//本机局域网的IP地址InetAddress inetAddress3 = InetAddress.getLocalHost();System.out.println(inetAddress3);//通过域名获取网站IP地址InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress4);System.out.println("------------------------");//常用的方法System.out.println(inetAddress4.getCanonicalHostName());//获取规范的主机名System.out.println(inetAddress1.getHostAddress());//获取主机IP地址System.out.println(inetAddress1.getHostName());//获取主机名或域名} catch (UnknownHostException e) {e.printStackTrace();}}
}
2.4、网络编程之端口和协议
(1)端口:
物理端口: 网卡端口;
逻辑端口: 用于标识进程的逻辑地址,有效端口:0-65535;其中0-1023为公有端口。
(2)协议:
UDP: 将数据源和目的封装在数据包中,不需要建立连接,每个数据包的大小限制在64k;因为是不需要连接的,所以不可靠,但速度很快。
TCP: 在传输数据前在发送端和接收端建立逻辑连接,然后再传输数据,提供了两台计算机之间的可靠无差错的数据传输。每次建立连接都需要经过 “三次握手” 。
● 第一次握手:客户端向服务端发出连接请求,等待服务器的确认;● 第二次握手: 服务端向客户端回送一个响应,通知客户端收到了连接请求;● 第三次握手:客户端再次向服务器端发送确认请求,确认连接。
DOS下的命令:
1、netstat -ano 查看所有的端口
2、netstat -ano|findstr "8990" 查看指定的端口
3、tasklist|findstr "8990" 查看指定端口的进程
代码演示:
import java.net.InetSocketAddress;/*** IP地址+端口*/
public class InetSocketAddressDemo {public static void main(String[] args) {//封装计算机的IP地址和端口号InetSocketAddress socketAddress1 = new InetSocketAddress("127.0.0.1",5368);InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 5368);System.out.println(socketAddress1);System.out.println(socketAddress2);System.out.println(socketAddress1.getAddress());System.out.println(socketAddress1.getHostName());System.out.println(socketAddress1.getPort());}
}
TCP实现客户端和服务器发消息:
在JDK中提供了两个类用于实现TCP程序,一个是 ServerSocket 类,用于表示服务器,一个是 Socket 类,用于表示客户端。
客户端 Socket 向服务器 ServerSocket 请求连接 ——> 实现了数据的通路连接。
在连接的过程中,IO流对象就已经创建完毕了。
服务器和客户端就通过字节流来通信。
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;/*** 客户端*/
public class TCPClientDemo {public static void main(String[] args) {Socket socket = null;OutputStream os = null;try {//1、创建出服务器的地址和端口号InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9999;//2、创建一个Socket连接socket = new Socket(inetAddress, port);os = socket.getOutputStream();os.write("你好啊服务器".getBytes());} catch (IOException e) {e.printStackTrace();} finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 服务器端*/
public class TCPServerDemo {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;ByteArrayOutputStream baos = null;InputStream is = null;try {while (true) {//1、根据地址连接客户端serverSocket = new ServerSocket(9999);socket = serverSocket.accept();//2、读取客户端的消息is = socket.getInputStream();//字节流把读取到的信息打印到控制台baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {baos.write(buffer,0,len);}System.out.println(baos.toString());}} catch (IOException e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}if (baos != null) {try {baos.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}if (serverSocket != null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
TCP实现客户端和服务器之间文件的上传:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/*** 客户端*/
public class TCPClientDemo {public static void main(String[] args) throws IOException {//1、创建Socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8000);//2、创建的输出流OutputStream os = socket.getOutputStream();//3、读取文件写进输出流中FileInputStream fis = new FileInputStream(new File("Krile.jpg"));byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {os.write(buffer, 0, len);}//4、通知服务器已经传输完毕socket.shutdownOutput();//5、确认服务器完成接收,断开连接InputStream is = socket.getInputStream();ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024];int len2;while ((len2 = is.read(buffer2)) != -1){bos.write(buffer2,0,len2);}System.out.println(bos.toString());bos.close();is.close();fis.close();os.close();socket.close();}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** 服务器端*/
public class TCPServerDemo {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream is = null;FileOutputStream fos = null;OutputStream os = null;try {//1、创建服务serverSocket = new ServerSocket(8000);//2、连接客户端socket = serverSocket.accept();//3、读取客户端的文件is = socket.getInputStream();//4、输出文件fos = new FileOutputStream(new File("receive.jpg"));byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}//通知客户端接收完毕os = socket.getOutputStream();os.write("接受完成,可以断开连接".getBytes());} catch (IOException e) {e.printStackTrace();} finally {if (os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if (serverSocket != null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
UDP实现发送消息
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** 发送端*/
public class UDPClientDemo {public static void main(String[] args) throws Exception {//1、建立一个SocketDatagramSocket socket = new DatagramSocket();//2、建个地址端口包InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9991;String msg = "你好,接收端!";//发送的目标和数据DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.length(),inetAddress,port);//3、发包socket.send(packet);socket.close();}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** 接收端*/
public class UDPServerDemo {public static void main(String[] args) throws Exception {//开放客户端端口DatagramSocket socket = new DatagramSocket(9991);//接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);socket.receive(packet);System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(), 0, packet.getLength()));socket.close();}
}
UDP实现控制台发送消息接收消息
import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** UDP协议的发送端:* DatagramPacket:将你的数据包装* DatagramSocket:将你的数据发送出去* <p>* 实现步骤:* 1、创建DatagramPacket对象,封装数据,接收的地址和端口* 2、创建DatagramSocket对象* 3、发送数据* 4、关闭资源*/
public class UDPSend {public static void main(String[] args) {Scanner scanner = null;InetAddress ip = null;DatagramSocket socket = null;int port = 9999;while (true) {try {scanner = new Scanner(System.in);ip = InetAddress.getByName("hang");String str = scanner.nextLine();byte[] data = str.getBytes();DatagramPacket packet = new DatagramPacket(data, 0, data.length, ip, port);socket = new DatagramSocket();socket.send(packet);if (str.equals("Bye")){socket.close();scanner.close();return;}} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** UDP协议接收数据端:* DatagramPacket:接收数据* DatagramSOcket:接收数据包* <p>* 实现步骤:* 1、创建DatagramSocket对象,绑定端口号和发送端一致* 2、创建字节数组接收发来的数据* 3、创建DatagramPacket对象* 4、调用DatagramSocket对象方法接受数据,将数据放在数据包中。* 5、拆包* 发送的IP地址* 接收的字节个数* 发送端的端口*/
public class UDPReceive {public static void main(String[] args) throws IOException {//1、创建DatagramSocket对象,绑定端口号和发送端一致DatagramSocket socket = new DatagramSocket(9999);while (true) {// 2、创建字节数组接收发来的数据byte[] data = new byte[1024];//3、创建DatagramPacket对象DatagramPacket packet = new DatagramPacket(data, 0, data.length);//4、调用DatagramSocket对象方法接受数据,将数据放在数据包中。socket.receive(packet);//线程阻塞接受数据//5//获取发送端的IP地址和端口号String ip = packet.getAddress().getHostAddress();int port = packet.getPort();//打印输出接受到的数据int length = packet.getLength();String str = new String(data, 0, length);System.out.println(ip + ":" + port + " " + str);if (str.equals("Bye")) {socket.close();return;}}}
}
获取指定URL资源
import java.net.MalformedURLException;
import java.net.URL;/*** URL获取网络资源*/
public class URLDemo01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost/helloworld/index.jsp?username=zhao&password=1123");System.out.println(url.getProtocol());//获取网络协议System.out.println(url.getHost());//获取主机IPSystem.out.println(url.getPort());//获取端口System.out.println(url.getPath());//获取文件路径System.out.println(url.getFile());//获取文件全路径System.out.println(url.getQuery());//获取文件参数}
}
JavaSE基础——网络编程相关推荐
- JAVA基础 网络编程
JAVA基础 网络编程 网络我们每天都会用到的,在我们生活中占的地位也在不断的提高,我们下面就简单了解下网络编程的内容. 想要学习网络编程,首先就需要了解网络编程包含哪些内容. 网络编程包括 IP节点 ...
- JavaSE:网络编程
JavaSE:网络编程 文章目录 前言 一.网络编程概述 二.网络通信的要素 三.IP 四.端口 五.通信协议 六.TCP 1. 发送接收消息 2. 文件上传 3. 初识Tomcat 七.UDP 1. ...
- JavaSE高级 网络编程
JavaSE高级 网络编程 教学目标 能够辨别UDP和TCP协议特点 UDP 无连接,基于数据包,发出去就不管了,性能好,可能丢失数据. TCP有连接,基于通信管道,可靠传输. 能够说出TCP协议下两 ...
- 【JavaSE】网络编程 Jpcap的使用
[JavaSE]网络编程 Jpcap的使用 前言:由于之前课程需要做个网络课程设计,题目是IP数据包的捕获与解析,考虑再三之后选择用Java来做(主要是因为Java界面比较好写,个人这么觉得),于是在 ...
- javase基础socket编程之局域网聊天,局域网文件共享
2017年06月04日 23点25分 javase基础学完可以做什么,javase实现局域网聊天室 包含内容:基础语法,面向对象,多线程,IO流,GUI编程,网络编程(udp) 实现功能:局域网群聊 ...
- 【JavaSE】网络编程(606~630)
606.IO流与网络编程-每天一考 说明流的三种方式 流向:输入流.输出流 数据单位:字节流.字符流 流的单位:节点流.处理流 写出4个IO流中抽象基类,4个文件流,4个缓冲流 抽象基类:InputS ...
- python的基础网络编程是下列_Python基础(六)网络编程
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...
忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...
- 【JavaSe】网络编程篇(一) 网络编程入门
JavaSe·网络编程篇(一) 网络编程入门 1. 软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.百度网盘等软件 B/S结构 :全称为Browse ...
- JavaSE - 11 网络编程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.网络编程概述 1.1 什么是网络 1.2 网络编程的三要素 1.3 IP地址 1.4 端口号 1.5 协议 2.通信程序 ...
最新文章
- date类型_06076.1.0如何将ORC格式且使用了DATE类型的Hive表转为Parquet表
- container_of(ptr, type, member)宏定义解析
- 错误 C2664 “int WideCharToMultiByte......”: 无法将参数 3 从“CString”转换为“LPCWCH” 的问题解决
- 五大开源游戏引擎介绍
- 基于webpack4.X从零搭建React脚手架
- 德克萨斯州ADRN组织支持12种加密货币捐赠 现已收到700美元ETH捐款
- 【PAT乙】1030 完美数列 (25分) 枚举
- 英特尔驱动程序下载_如何修复英特尔计算机上的“此计算机未验证正在安装的驱动程序”...
- Unity3d 人物跳跃后落地悬空问题
- iov_iter操作
- 程序员刷简历领导看见很寒心,网友:找工作也要经过你同意?
- 微信小程序之 获取input框输入值
- SOEM 源码解析 ecx_FPWRw
- 硬件辅助虚拟化 之EPT(内存虚拟化)介绍
- 视频播放不流畅怎么办?使用CDN加速一步搞定!
- 《管理学》第四章 计划
- AtCoder Beginner Contest 281 (A-F,口胡G)青大acmer 日常vp
- MAC版Proxyee Down百度网盘高速下载器教程
- js Cesium 返回范围的数据
- [人工智能-深度学习-41]:开发环境 - GPU进行训练安装与搭建(Pytroch、TensorFlow、Nvidia CUDA)详细过程
热门文章
- 【基础神经网络汇总】
- Android--数据存储
- 1011. A+B和C (15)
- java 数组或者链表输出
- asp.net中如何退出整个框架(frameset ),回到登录界面?
- 用Hough投票做物体检测的3篇文献
- jquery mysql jsp搜索功能_jquery实现的一个提前搜索功能
- python3.7如何使用enum_python3 enum模块
- 拓端tecdat|在R语言中使用概率分布:dnorm,pnorm,qnorm和rnorm
- (15)Python识别文字,tesseract包