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 - 网络的更多相关文章

  1. 7.4 (java学习笔记)网络编程之TCP

    一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...

  2. Java学习笔记(3)----网络套接字服务器多线程版本

    本例给出一个客户端程序和一个服务器程序.客户端向服务器发送数据.服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端.客户端在控制台上显示结果.在本例中,客户端发送的数据是圆的半径,服务器 ...

  3. Java学习笔记_网络+多线程

    支持同时收发的客户端和服务器端 客户端 import javax.swing.*; import java.awt.*; import java.io.*; import java.net.*; im ...

  4. Java学习笔记_网络(2)

    单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...

  5. java学习笔记_网络

    客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...

  6. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  7. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  8. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  9. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

随机推荐

  1. SpringBoot拦截器中Bean无法注入(转)

    问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Be ...

  2. JS中清空字符串前后空格

    在JS 操作的时候 长期会有对字符串的操作, 但是在JS 中不像在C#中 有字符串的方法 Trim() 来对字符串进行处理 .  所以自己写一个对字符串前后清楚空格的方法还是有必要的 以免以后忘记了 ...

  3. CAP原理和BASE思想

    分布式领域CAP理论,Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可 ...

  4. Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路

    端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...

  5. 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 ...

  6. monkey操作

    1.monkey命令格式 直接adb shell进入后输入monkey [options] <eventcount> 或者每次输入adb shell monkey [options] &l ...

  7. react,react native,webpack,ES6,node.js----------今天上午学了一下node.js

    http://www.yiibai.com/nodejs/node_install.html---node.js具体入门资料在此 Node JS事件循环 Node JS是单线程应用程序,但它通过事件和 ...

  8. Javaweb之 servlet 开发详解1

    1.1  Tip:Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个 ...

  9. C++ 文件流的方式操作文件(一个简单的写入,读取)

    新手学习c++哈,归纳的写了一下以 C++ 的方式写入读取文件,读文件到控制台,并加了行号.博客记录主要为了备忘.当然 ^_^ 喜欢同学的话可以拿走代码直接用.转帖注明出处哈.欢迎讨论,我一直认为:知 ...

  10. [ZLXOI2015]殉国 数论 扩展欧几里得

    题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数. 直接exgcd,求出x,y分别为最小正整数的解,然后一算就出来啦 #inclu ...