【原】Java学习笔记034 - 网络
package cn.temptation; import java.net.InetAddress; public class Sample01 {
public static void main(String[] args) throws Exception {
/*
* OSI模型:Open System Interconnection,开放系统互联
* 分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
*
* TCP/IP模型:
* 分为四层:应用层、传输层、网际层、主机至网络层
*
* OSI模型的会话层、表示层、应用层 对应 TCP/IP模型的应用层
* OSI模型的传输层 对应 TCP/IP模型的传输层
* OSI模型的网络层 对应 TCP/IP模型的网际层
* OSI模型的物理层、数据链路层 对应 TCP/IP模型的主机至网络层
*
* 常用协议:
* 应用层:HTTP协议、HTTPS协议、FTP协议
* 传输层:TCP协议、UDP协议
* 网络层:IP协议
*
* 网络编程的三要素:地址、端口、协议
* 类比:人 和 人 的交流
*
* 类 InetAddress:此类表示互联网协议 (IP) 地址。
*
* InetAddress类的常用成员方法:
* 1、static InetAddress getByName(String host):在给定主机名的情况下确定主机的 IP 地址。
* 2、String getHostName():获取此IP地址的主机名。
* 3、String getHostAddress():返回 IP地址字符串(以文本表现形式)。
*/ // 命令行窗口下输出hostname,可以查看到本机的名称
InetAddress address = InetAddress.getByName("temptation");
System.out.println(address); // temptation/192.168.137.2 String hostname = address.getHostName();
System.out.println(hostname); // temptation String ip = address.getHostAddress();
System.out.println(ip); // 192.168.137.2
}
}
package cn.temptation; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Sample02 {
public static void main(String[] args) throws IOException {
/*
* 传输协议:人们为了通信而制定的规则
* 常用协议:UDP、TCP
*
* 套接字Socket的机制:
* 1、进行通信的双方都有Socket
* 2、网络通信实际是Socket之间的通信
* 3、数据在Socket之间通过IO流进行传输
*
* Java语言中对UDP协议使用Socket进行了封装,提供了DatagramPacket类 和 DatagramSocket类
*
* 类 DatagramPacket:数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。
* 从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
*
* DatagramPacket类的常用构造函数:
* 1、DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为 length 的数据包。
* 2、DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
*
* 类 DatagramSocket:此类表示用来发送和接收数据报包的套接字。
* 数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
* 从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
* 在 DatagramSocket上总是启用 UDP 广播发送。为了接收广播包,应该将DatagramSocket绑定到通配符地址。
* 在某些实现中,将 DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。
*
* DatagramSocket类的常用成员方法:
* 1、void send(DatagramPacket p):从此套接字发送数据报包。
* 2、void close():关闭此数据报套接字。
*
* UDP协议的发送数据:
* 1、创建发送端Socket对象
* 2、创建数据,把数据进行打包
* 3、调用Socket对象的发送方法发送数据包
* 4、释放资源
*/ // 1、创建发送端Socket对象
DatagramSocket ds = new DatagramSocket(); // 2、创建数据,把数据进行打包
// A:创建数据
byte[] arr = ("Hello, UDP").getBytes();
// B:获取地址对象
InetAddress address = InetAddress.getByName("temptation");
// C:打包数据
DatagramPacket dp = new DatagramPacket(arr, arr.length, address, 1234); // 3、调用Socket对象的发送方法发送数据包
ds.send(dp); // 4、释放资源
ds.close();
}
}
package cn.temptation; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Sample03 {
public static void main(String[] args) throws IOException {
/*
* DatagramSocket类的常用构造函数:
* DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
*
* DatagramSocket类的常用成员方法:
* 1、void receive(DatagramPacket p):从此套接字接收数据报包。
*
* DatagramPacket类的常用成员方法:
* 1、byte[] getData():返回数据缓冲区。
* 2、int getLength():返回将要发送或接收到的数据的长度。
* 3、InetAddress getAddress():返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
*
* UDP协议的接收数据:
* 1、创建接收端Socket对象
* 2、创建一个数据包接收容器
* 3、调用Socket对象的接收方法进行接收
* 4、释放资源
*/ // 1、创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(1234); // 2、创建一个数据包接收容器
byte[] arr = new byte[1024];
DatagramPacket dp = new DatagramPacket(arr, arr.length); // 3、调用Socket对象的接收方法进行接收
ds.receive(dp); // 获取到的数据包内容可以使用
byte[] temp = dp.getData();
int length = dp.getLength();
String result = new String(temp, 0, length);
InetAddress address = dp.getAddress(); System.out.println(address.getHostAddress() + "接收到的数据为:" + result); // 4、释放资源
ds.close();
}
}
package cn.temptation; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Sample04 {
public static void main(String[] args) throws IOException {
// 需求:基于UDP协议,实现从键盘录入内容进行发送,如果输入886,则发送端结束输入;发送内容在接收端显示出来 // 发送端 // 创建Socket对象
DatagramSocket ds = new DatagramSocket(); // 键盘输入的标准输入流进行封装
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String temp = null; while ((temp = reader.readLine()) != null) {
if ("886".equals(temp)) { // 终止循环
break;
} else {
// 创建发送数据并打包
byte[] arr = temp.getBytes();
InetAddress address = InetAddress.getByName("temptation");
DatagramPacket dp = new DatagramPacket(arr, arr.length, address, 1234); // 发送
ds.send(dp);
}
} // 释放资源
ds.close();
}
}
package cn.temptation; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Sample05 {
public static void main(String[] args) throws IOException {
// 需求:基于UDP协议,实现从键盘录入内容进行发送,如果输入886,则发送端结束输入;发送内容在接收端显示出来 // 接收端 // 创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(1234); // 创建一个数据包接收容器
byte[] arr = new byte[1024];
DatagramPacket dp = new DatagramPacket(arr, arr.length); // 接收数据
ds.receive(dp); // 获取到的数据包内容可以使用
byte[] temp = dp.getData();
int length = dp.getLength();
String result = new String(temp, 0, length);
InetAddress address = dp.getAddress(); System.out.println(address.getHostAddress() + "接收到的数据为:" + result); // 释放资源
ds.close();
}
}
package cn.temptation; import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket; public class Sample06 {
public static void main(String[] args) throws IOException {
/*
* Java语言对TCP协议的使用封装了Socket,提供了:Socket类 和 ServerSocket类
*
* 类 Socket:实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
* 套接字的实际工作由 SocketImpl 类的实例执行。
* 应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
*
* Socket类的常用构造函数:
* 1、Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
* 2、Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
*
* Socket类的常用成员方法:
* 1、OutputStream getOutputStream():返回此套接字的输出流。
* 2、InputStream getInputStream():返回此套接字的输入流。
* 3、void close():关闭此套接字。
*
* 类 ServerSocket:实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
* 服务器套接字的实际工作由 SocketImpl 类的实例执行。
* 应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
*
* ServerSocket类的常用构造函数:
* 1、ServerSocket(int port):创建绑定到特定端口的服务器套接字。
*
* ServerSocket类的常用成员方法:
* 1、Socket accept():侦听并接受到此套接字的连接。
* 2、void close():关闭此套接字。
*
* TCP协议的发送数据:(客户端)
* 1、创建客户端的Socket对象
* 2、获取输出流,写出数据
* 3、释放资源
*/ // 1、创建客户端的Socket对象
Socket socket = new Socket(InetAddress.getByName("temptation"), 1234); // 2、获取输出流,写出数据
OutputStream os = socket.getOutputStream();
os.write("Hello TCP".getBytes()); // 3、释放资源
socket.close(); // 注意:
// TCP的客户端没有连接服务端时执行,会产生执行异常:java.net.ConnectException: Connection refused: connect
// UDP的发送端没有接收端时执行,不会产生执行异常
// 理解:TCP类似打电话(没有对应号码时提示是空号或是不存在),UDP类似广播(喊一嗓子,听见了就听见了,没听见就没听见)
}
}
package cn.temptation; import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; public class Sample07 {
public static void main(String[] args) throws IOException {
/*
* TCP协议的接收数据:(服务端)
* 1、创建服务端的Socket对象
* 2、监听客户端的连接,返回一个对应的Socket对象
* 3、获取输入流
* 4、释放资源
*/ // 1、创建服务端的Socket对象
ServerSocket serverSocket = new ServerSocket(1234); // 2、监听客户端的连接,返回一个对应的Socket对象
// 监听客户端的连接,如果没有客户端连接时,一直阻塞
Socket socket = serverSocket.accept(); // 3、获取输入流
InputStream is = socket.getInputStream(); byte[] arr = new byte[1024];
int length = is.read(arr);
String result = new String(arr, 0, length); System.out.println("接收到的内容为:" +result); // 4、释放资源
socket.close();
serverSocket.close();
}
}
package cn.temptation; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket; public class Sample08 {
public static void main(String[] args) throws IOException {
// 需求:基于TCP协议,实现从键盘录入内容进行发送,如果输入886,则客户端结束输入;发送内容在服务端显示出来 // 客户端 // 创建客户端Socket对象
Socket socket = new Socket("temptation", 1234); // 键盘录入数据
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String temp = null; while ((temp = reader.readLine()) != null) {
if ("886".equals(temp)) {
break;
} else {
writer.write(temp);
writer.newLine();
writer.flush();
}
} // 释放资源
writer.close();
reader.close();
socket.close();
}
}
package cn.temptation; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; public class Sample09 {
public static void main(String[] args) throws IOException {
// 需求:基于TCP协议,实现从键盘录入内容进行发送,如果输入886,则客户端结束输入;发送内容在服务端显示出来 // 服务端 // 创建服务端Socket对象
ServerSocket serverSocket = new ServerSocket(1234); // 监听连接
Socket socket = serverSocket.accept(); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String temp = null; while ((temp = reader.readLine()) != null) {
System.out.println("接收的内容为:" + temp);
} // 释放资源
reader.close();
socket.close();
serverSocket.close();
}
}
【原】Java学习笔记034 - 网络的更多相关文章
- 7.4 (java学习笔记)网络编程之TCP
一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...
- Java学习笔记(3)----网络套接字服务器多线程版本
本例给出一个客户端程序和一个服务器程序.客户端向服务器发送数据.服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端.客户端在控制台上显示结果.在本例中,客户端发送的数据是圆的半径,服务器 ...
- Java学习笔记_网络+多线程
支持同时收发的客户端和服务器端 客户端 import javax.swing.*; import java.awt.*; import java.io.*; import java.net.*; im ...
- Java学习笔记_网络(2)
单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...
- java学习笔记_网络
客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
随机推荐
- SpringBoot拦截器中Bean无法注入(转)
问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Be ...
- JS中清空字符串前后空格
在JS 操作的时候 长期会有对字符串的操作, 但是在JS 中不像在C#中 有字符串的方法 Trim() 来对字符串进行处理 . 所以自己写一个对字符串前后清楚空格的方法还是有必要的 以免以后忘记了 ...
- CAP原理和BASE思想
分布式领域CAP理论,Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可 ...
- Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路
端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...
- Can I use MyBatis to generate Dynamic SQL without executing it?
Although MyBatis was designed to execute the query after it builds it, you can make use of it's conf ...
- monkey操作
1.monkey命令格式 直接adb shell进入后输入monkey [options] <eventcount> 或者每次输入adb shell monkey [options] &l ...
- react,react native,webpack,ES6,node.js----------今天上午学了一下node.js
http://www.yiibai.com/nodejs/node_install.html---node.js具体入门资料在此 Node JS事件循环 Node JS是单线程应用程序,但它通过事件和 ...
- Javaweb之 servlet 开发详解1
1.1 Tip:Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个 ...
- C++ 文件流的方式操作文件(一个简单的写入,读取)
新手学习c++哈,归纳的写了一下以 C++ 的方式写入读取文件,读文件到控制台,并加了行号.博客记录主要为了备忘.当然 ^_^ 喜欢同学的话可以拿走代码直接用.转帖注明出处哈.欢迎讨论,我一直认为:知 ...
- [ZLXOI2015]殉国 数论 扩展欧几里得
题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数. 直接exgcd,求出x,y分别为最小正整数的解,然后一算就出来啦 #inclu ...