`
从此醉
  • 浏览: 1044703 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

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();
}
}
-------------------------------------------------------------------------------------------
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics