java学习笔记(9)——网络
计算机网络:
最简单的网络由两台计算机组成
计算机A ---协议---> 网络 ---协议---> 计算机B---->端口1---->A软件
192.168.0.118
192.168.0.10
一、IP地址
IP网络中每台主机都必须有一个唯一的IP地址;
IP地址是一个逻辑地址;
因特网上的IP地址具有全球唯一性;
32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16
二、协议
为了进行网络中的数据交换(通信)而建立的规则,标准或约定。(=语义+语法+规则)
不同层具有各自不同的协议
三、网络的状况
多种通信媒介——有线,无线......
不同种类的设备——通用,专用......
不同的操作系统——Unix,Windows......
不同的应用环境——固定,移动......
不同业务种类——分时,交互,实时......
宝贵的投资和积累——有形,无形......
用户业务的延续性——不允许出现大的跌岩起伏。
它们相互交织,形成了非常复杂的系统应用环境。
四、网络异质性问题的解决
网络体系结构就是使这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现
互操作性,并满足各种业务需求的一种粘合剂,它营造了一种"生存空间"——任何厂商的任何产品
以及任何技术只要遵守这个空间的行为规则,就能够在其中生存并发展。
网络体系结构解决异质性问题采用的是分层方法——把复杂的网络互连问题划分为若干个较小的、单一
的问题,在不同层上予以解决。
五、ISO/OSI七层参考模型
OSI(Open System Interconnection)参考模型将网络的不同功能划分为7层。(抽象的参考模型)
应用层————————————————>处理网络应用
表示层————————————————>数据表示
会话层——————————————————>主机间通信
传输层——————————————————>端到端的连接
网络层————————————————>寻址和最短路径
数据链路层————————————>介质访问(接入)
物理层——————————————>二进制传输
通信实体的对等层之间不允许直接进行通讯。
各层之间是严格的单项依赖。
上层使用下层提供的服务——Service user;
下层向上层提供服务——Service provider;
六、对等通信示例
中国教师 你好
Hallo 德国教师
翻译 Hello
Hello 翻译
秘书 传真
<------物理通信线路-----> 传真 秘书
七、OSI各层所使用的协议
应用层:远程登录协议Telnet,文件传输协议FTP,超文本传输协议HTTP,域名服务DNS,简单邮件传输协议SMTP,
邮局协议POP3等。
传输层:传输控制协议TCP,用户数据报协议UDP.
TCP:面向连接的可靠地传输协议。(数据完整性要求较高 如:安装程序)
UDP:是无连接的,不可靠的传输协议。(实时性较高,如:视频会议)
网络层:网络协议IP,Internet互联网控制报文协议ICMP,Internet组管理协议IGMP.
八、数据封装
一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为封装。
封装就是在数据前面加上特定的协议头部。
OSI参考模型,对等层协议之间交换的信息单元统称为协议数据单元(PDU,Protocol Data Unit)
OSI参考模型中每一层都要依靠下一层提供的服务。
为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(和尾部)。头部中含有完成数据
传输所需的控制信息。
这样,数据自上而下递交的过程实际上就是不断封装的过程。到达目的地后自下而上递交的过程就是不断拆封的过程
。由此可知,在物理线路上传输的数据,其外面实际上被包括了多层"信封".
但是,某一层只能识别由对等层封装的"信封",而对于被封装在"信封"内部的数据仅仅是拆封后将其提交给上层,
本层不作任何处理。
九、TCP/IP模型
TCP/IP起源于美国国防部高级研究规划署
(DARPA)的一项研究计划——实现若干台主句的相互通信。
现在TCP/IP已成为Internet上通信的工业标准。
TCP/IP模型包括4个层次:
应用层
传输层
网络层
网络接口
十、TCP/IP与OSI参考模型的对应关系
OSI参考模型
TCP/IP模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口
物理层
十一、端口
端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接后
传输成传给该端口的数据都被相应的进程等等所接收,相应进程发给传输层的数据都通过该端口输出。
端口用一个整数标示符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的
两个软件模块,因此个自的端口号也相互独立,端口通常称为协议端口,简称端口。
端口使用一个16位的数字来表示,他的范围是0————65535, 1024以下的端口号保留预定义的服务。例如:http使用
80端口。
十二、套接字(socket)的引入
为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用
socket(套接字)。
十三、基于TCP的socket编程
=============================================================================
server
client
ServerSocket(int port)
Socket(InetAddress address, int port)
Socket accept()
OutputStream
OutputStream
SocketgetOutputStream()
SocketgetOutputStream()
InputStream
InputStream
SocketgetInputStream()
SocketgetInputStream()
Socket.close()
Socket.close()
===============================================================================
服务器程序编写:
1,调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定的端口上。
2,调用accept(),监听链接请求,如果客户端请求连接,则接受连接,返回通信套接字。
3,调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
4,最后关闭通信套接字。
客户端程序编写:
1,调用Socket()创建一个流套接字,并连接到服务器端。
2,调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
3,最后敢比通行套接字。
------------------------------------------------------------------------------
package packet3;
//服务器端编程
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class Server extends Thread{
private Socket s;
public Server(Socket s){
this.s = s;
}
public void run(){
try {
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
os.write("Hello,welcome you".getBytes());
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0,len));
os.close();
is.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(6000);
while(true){
Socket s = ss.accept();
new Server(s).start();
}
//ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-----------------------------------------------------------------------------
package packet3;
//客户端编程
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket(InetAddress.getByName("localhost"), 6000);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0,len));
os.write("hello ,I am zhangsan".getBytes());
is.close();
os.close();
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
====================================================================================
十四、基于UDP的socket编程
Server
Client
DatagramSocket(int port)
DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int length,InetAddress address,int port)
DatagramSocket.receive(DatagramPacket p)
DategramSocket.send(DatagramPacket p)
DatagramSocket.close()
DatagramSocket.close()
=======================================================================================================
接收端程序编写:
1,调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上;
2,调用DataPacket(byte[] buf,int length),创建一个字节数组以接收UDP包,
3,调用DatagramSocket类的receive(),接收UDP包,
4,最后关闭数据报套接字。
发送端程序编写:
1,调用DatagramSocket()创建一个数据报套接字
2,调用DatagramPacket(byte[] buf, int offset,int length, InetAddress address, int port),建立要发送的UDP包。
3,最后关闭数据报套接字。
-----------------------------------------------------------------------------------------
package packet3;
//服务器端,接收数据端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class UDPServer {
public static void main(String[] args) {
recv();
}
public static void recv(){
try {
DatagramSocket ds = new DatagramSocket(6000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,1024);
ds.receive(dp);
System.out.println(new String(buf,0,dp.getLength()));
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
------------------------------------------------------------------------------------------------
package packet3;
//客户端,发送数据端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPClient {
public static void main(String[] args) {
send();
}
public static void send(){
try {
DatagramSocket ds = new DatagramSocket();
String str = "Hello,this is zhangsan";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),6000);
ds.send(dp);
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
--------------------------------------------------------------------------------------------
package packet3;
//服务器端,接收和发送数据端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class UDPServer {
public static void main(String[] args) {
recv();
}
public static void recv(){
try {
DatagramSocket ds = new DatagramSocket(6000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,1024);
ds.receive(dp);
System.out.println(new String(buf,0,dp.getLength()));
String str = "Welcome you";
DatagramPacket dpSend = new DatagramPacket(str.getBytes(),str.length(),dp.getAddress(),dp.getPort());
ds.send(dpSend);
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------------------------------------------------------------------------------
package packet3;
//客户端 ,接收和发送数据端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPClient {
public static void main(String[] args) {
send();
}
public static void send(){
try {
DatagramSocket ds = new DatagramSocket();
String str = "Hello,this is zhangsan";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),6000);
ds.send(dp);
byte[] buf = new byte[1024];
DatagramPacket dpGet = new DatagramPacket(buf,1024);
ds.receive(dpGet);
System.out.println(new String(buf,0,dpGet.getLength()));
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
=======================================================================================
十五、URL与URI
URL(uniform Resource Locator),通用资源定位符。
http://www.mybole.com.cn/index.asp就是一个URL.
URI(Uniform Resource Identifier),通用资源标识符。
URI纯粹是个符号结构,用于指定构成Web资源的字符串的各个不同部分。URL是一种特殊类型的URI,它包含了
用于查找某个资源的足够信息。其它的URI,例如:
mailto:myoble@mybole.com.cn则不属于定位符,因为它里面不存在根据该标识符来查找的任何数据。这种URI称为URN
(通用资源名).
在Java库中,URI类不包含用于访问通用资源标识符设定的任何方法,他的唯一作用是进行分析。相反,URL类则可以
打开到达资源的一个字符串。
------------------------------------------------------------------------------------------------
//下载一个文件的程序
package packet3;
import java.net.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
public class Download {
public static void main(String[] args) {
JFrame jf = new JFrame("我的下载程序");
jf.setSize(600,400);
jf.setLocation(100,100);
JPanel p = new JPanel();
JLabel l = new JLabel("please input URL");
final JTextField tf = new JTextField(30);
p.add(l);
p.add(tf);
jf.getContentPane().add(p,"North");
final JTextArea ta = new JTextArea();
jf.getContentPane().add(ta,"Center");
JButton btn = new JButton("Download");
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String str = tf.getText();
try {
URL url = new URL(str);
System.out.println(url);
URLConnection urlConn = url.openConnection();
System.out.println(urlConn);
ta.append("Host:"+url.getHost());
String line = System.getProperty("line.separator");
ta.append(line);
ta.append("Port:"+url.getDefaultPort());
ta.append(line);
ta.append("ContentLength:"+urlConn.getContentLength());
ta.append(line);
ta.append("ContentType:"+urlConn.getContentType());
InputStream is = urlConn.getInputStream();
//InputStreamReader isr = new InputStreamReader(is);
//BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream("1.html");
//String strLine;
//while((strLine = br.readLine()) != null){
// fos.write(strLine.getBytes());
// fos.write(line.getBytes());
//}
int data;
while((data = is.read()) != -1){
fos.write(data); //用字符流比较好,图片,文本都能读取。
//字符流不能读取图片信息。
}
//br.close();
is.close();
fos.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
jf.getContentPane().add(btn,"South");
jf.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
jf.show();
}
}
-------------------------------------------------------------------------------------------
java学习笔记(9)——网络的更多相关文章
- 【原】Java学习笔记034 - 网络
package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...
- 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学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- 用CSS实现阴阳八卦图等图形
CSS还是比较强大的,可以实现中国古典的"阴阳八卦图"等形状. 正方形 #rectangle { width: 200px; height: 100px; backgrount-c ...
- 【rlz03】十六进制转十进制
Time Limit: 3 second Memory Limit: 2 MB 问题描述 输入一个十六进制数,编程转换为十进制数. 整数部分不会超过65535,十六进制的小数部分不会超过2位. Sam ...
- Windows平台CUDA开发之前的准备工作
CUDA是NVIDIA的GPU开发工具,眼下在大规模并行计算领域有着广泛应用. windows平台上面的CUDA开发之前.最好去NVIDIA官网查看说明,然后下载对应的driver. ToolKits ...
- vim :g
https://stackoverflow.com/questions/1946738/vim-how-to-delete-every-second-row An elegant (and effic ...
- 那些移动端web踩过的坑2
原文链接:https://geniuspeng.github.io/2018/04/26/mobile-issues2/ 坑是无穷无尽的,嗯-长江后坑推前坑~~ 关于音频自动播放 H5的audio标签 ...
- 【34.57%】【codeforces 557D】Vitaly and Cycle
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【u117】队列安排
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1. 先将1号同学安排 ...
- 最简单的基于FFmpeg的移动端样例:IOS HelloWorld
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
- [转载]Ocelot简易教程(一)Ocelot是什么
Ocelot简易教程(一)Ocelot是什么 简单的说Ocelot是一个用.NET Core实现并且开源的API网关技术. 可能你又要问了,什么是API网关技术呢?Ocelot又有什么特别呢?我们又该 ...
- HDU 1243 反恐训练营 (动态规划求最长公共子序列)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...