java计算机网络从基础到入门.docx
《java计算机网络从基础到入门.docx》由会员分享,可在线阅读,更多相关《java计算机网络从基础到入门.docx(13页珍藏版)》请在冰豆网上搜索。
java计算机网络从基础到入门
1、计算机网络
●指分布在不同地域的计算机,通过外部设备连接起来,实现了资源共享与数据传输的计算机系统。
Extends:
IP
●IP地址
•Internet上的每台主机(Host)都有一个唯一的IP地址。
IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。
例如159.226.1.1。
(四个字节)
●IP地址类别
•IP地址是由网络号和主机号组成
•A类地址:
8位网络位,24位主机位
•B类地址:
16位网络位,16位主机位
•C类地址:
24位网络位,8位主机位
●特殊的IP地址
127.0.0.1表示本机回环地址
Extends:
Port
●Port地址
•如果把IP地址比作一间房子,端口就是出入这间房子的门。
真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:
2^16)个之多!
端口是通过端口号来标记的,端口号只有整数,范围是从0到65535(2^16-1)。
●Port分类(0~65535)
•公认端口(WellKnownPorts):
从0到1023,它们紧密绑定(binding)于一些服务。
•注册端口(RegisteredPorts):
从1024到49151。
它们松散地绑定于一些服务。
•动态和/或私有端口(Dynamicand/orPrivatePorts):
从49152到65535。
●常用端口
•21FTP
•80HTTP
•443HTTPS
Extends:
协议
●TCP:
TransmissionControlProtocol传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transportlayer)通信协议。
●特点:
•面向连接的协议,数据传输必须要建立连接,所以在TCP中需要连接时间。
•传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据。
•一个可靠的协议,确保接收方完全正确地获取发送方所发送的全部数据。
●UDP:
UserDatagramProtocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
●特点:
•每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
•UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
•UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
Extends:
通信要素
Java网络编程
●Java网络编程
•Java网络编程其实就是实现局域网或互联网之间的数据通信(数据传输)。
●Java网络编程要素
•通过前面的知识,大家知道了计算机之间的数据传输需要三个要素。
•IP(主机名)、端口、协议
•Java是OOP语言,所以将其封装为特定的对象,.*
●对象映射
•IP主机名(InetAddress)
•端口数字标识不用封装为对象
InetAddress
●InetAddress
•此类表示互联网协议(IP)地址。
●功能
•getLocalHost()
•getHostAddress()
•getHostName()
•getByName(Stringhost)
•getAllByName(Stringhost)
●细节
•使用getByName(Stringhost)通过一个IP地址找主机时,如果IP和Address没有对应在公网上,那么该IP解析不了对应的地址,而且显示为对应IP且查询很慢。
•可以getByName(Stringhost)找出域名对应的IP,getAllByName()可以获取多个地址。
UDP和TCP协议
●UDP
•将数据极其源和目的封装为数据包,不需要建立连接。
•每个数据包大小限制在64K中
•因为无连接,所以不可靠
•因为不需要建立连接,所以速度快
如:
人说话、飞秋、凌波、CS等
●TCP
•面向连接,有特有的通道
•在连接中传输大数据量
•通过三次握手机制连接,可靠协议
•通信前必须建立连接,效率稍低
如:
打电话,文件的传送.
Extends:
三次握手机制
Socket编程(网络编程)
●Socket
•socket的英文原义是“孔”或“插座”。
作为4BDSUNIX的进程通信机制,取后一种意思。
通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(引用)。
•每个插座就是一个应用程序。
●细节
•不同的通信规则需要定义不同的插座。
•UDP:
DatagramSocket、DatagramPacket
•TCP:
ServerSocket、Socket
UDP数据传输
●UDP数据传输
•DatagramSocket与DatagramPacket
•建立发送端,接收端
•建立数据包
•调用Socket的发送接收方法
•关闭Socket
●注意
•发送端与接收端是两个独立的运行程序
•发送端发送数据的端口是随机的
•IDE中的控制台切换
UDP发送端
●在发送端,要在数据包对象中明确目的地IP及端口。
●DatagramSocketsocket=newDatagramSocket();
●byte[]bs="helloWorld".getBytes();
●InetAddressadress=InetAddress.getByName("127.0.0.1");
●intport=5800;
●DatagramPacketpack=newDatagramPacket(bs,bs.length,adress,port);
●socket.send(pack);
●socket.close();
●在接收端,要指定监听的端口。
●DatagramSocketsocket=newDatagramSocket(5800);
●byte[]bs=newbyte[1024];
●DatagramPacketpack=newDatagramPacket(bs,bs.length);
●socket.receive(pack);
●InetAddressadress=pack.getAddress();
●byte[]b=pack.getData();
●intport=pack.getPort();
●System.out.println(adress);
●System.out.println(port);
●System.out.println(newString(b,0,b.length));
●socket.close();
●修改代码,使得接受者可以连续接收发送者发送的数据
●修改代码,使得发送的数据是可变的,如可以从控制台上输入
●DatagramSocketsocket=newDatagramSocket(10001);
●while(true){
●byte[]bs=newbyte[1024];
●DatagramPacketpack=newDatagramPacket(bs,bs.length);
●socket.receive(pack);
●InetAddressadress=pack.getAddress();
●byte[]b=pack.getData();
●intport=pack.getPort();
●System.out.print(adress+"");
●System.out.print(port+"");
●System.out.println(newString(b,0,b.length));
●}
键盘接收数据的发送端
publicstaticvoidmain(String[]args)throwsException{
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
Stringstr=null;
DatagramSocketsocket=newDatagramSocket();
DatagramPacketpack=null;
byte[]bs=null;
while((str=br.readLine())!
=null){
if(str.equals("finish"))
break;
bs=str.getBytes();
pack=newDatagramPacket(bs,bs.length,InetAddress.getByName("127.0.0.1"),10001);
socket.send(pack);
}
socket.close();
}
一个网络段中有两个地址不能使用,一个是0一个就是255,如:
192.168.10.0代表一个网络地址,192.168.10.255代表广播地址。
所以可以改变数据包的目的地址实现群聊功能。
TCP数据传输
●TCP数据传输
•ServerSocket和Socket
•建立客户端和服务器端
•建立连接后,通过Socket中的IO流进行数据的传输
•关闭socket
●注意
•同样,客户端与服务器端是两个独立的应用程序。
TCP客户端
●通过Socket建立对象并指定要连接的服务端主机以及端口。
●publicstaticvoidmain(String[]args)throwsException{
●Socketsocket=newSocket("127.0.0.1",10000);
●OutputStreamout=socket.getOutputStream();
●
●out.write("你好".getBytes());
●socket.close();
●}
●建立服务端需要监听一个端口
●publicstaticvoidmain(String[]args)throwsException{
●ServerSocketserver=newServerSocket(10000);
●Socketsocket=server.accept();
●InputStreamin=socket.getInputStream();
●byte[]b=newbyte[1024];
●intlen=0;
●while((len=in.read(b))!
=-1){
●System.out.println(socket.getInetAddress().getHostAddress()+":
“
●+newString(b,0,len));
●}
●server.close();
●}
●在上面程序上实现互相的输入和输出
●publicstaticvoidmain(String[]args)throwsException{
●Socketsocket=newSocket("127.0.0.1",10000);
●OutputStreamout=socket.getOutputStream();
●out.write("你好".getBytes());
●InputStreamin=socket.getInputStream();
●byte[]b=newbyte[1024];
●intlen=0;
●len=in.read(b);
●System.out.println(newString(b,0,len));
●socket.close();
●}
Extends
publicstaticvoidmain(String[]args)throwsException{
ServerSocketserver=newServerSocket(10000);
Socketsocket=server.accept();
InputStreamin=socket.getInputStream();
byte[]b=newbyte[1024];
intlen=0;
len=in.read(b);
System.out.println(socket.getInetAddress().getHostAddress()+":
“
+newString(b,0,len));
OutputStreamout=socket.getOutputStream();
out.write("我收到了....".getBytes());
server.close();
}
BS开发
publicstaticvoidmain(String[]args)throwsException{
ServerSocketserver=newServerSocket(11000);
Socketsocket=server.accept();
OutputStreamout=socket.getOutputStream();
out.write("客户端你好!
!
".getBytes());
out.close();
System.out.println(socket.getInetAddress().getHostAddress());
server.close();
}
FeiQDemo.java
packagecn.itcast.udp;
importjava.io.IOException;
import.DatagramPacket;
import.DatagramSocket;
import.InetAddress;
import.UnknownHostException;
importjava.util.Date;
/*
使用udp协议给feiQ发送信息。
每一个网络通讯程序,都处理自己制定格式的数据,不会任何的格式数据都处理的。
(加密)
version:
time:
sender:
ip:
flag:
content;
版本:
时间:
发送者:
IP:
标识:
内容;
32
udp协议中有一个ip地址称作为广播地址,广播地址就是主机号为255的,如果发送消息的时候是往广播地址发送,那么在同一个网络号的人都可以收到信息。
*/
publicclassFeiQDemo{
publicstaticvoidmain(String[]args)throwsIOException{
//第一步:
建立udp的服务
DatagramSocketdatagramSocket=newDatagramSocket();
//第二步:
准备数据,然后把数据封装到数据包中,
Stringdata=getData("feiQ你好");
DatagramPacketdatagramPacket=newDatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getByName("192.168.10.255"),2425);
//第三步:
调用udp的服务发送数据
datagramSocket.send(datagramPacket);
//关闭资源
datagramSocket.close();
}
//把数据组装成feiQ处理的格式数据
publicstaticStringgetData(Stringdata){
StringBuildersb=newStringBuilder();
sb.append("1.0:
");
sb.append(System.currentTimeMillis()+":
");
sb.append("李克强:
");
sb.append("192.168.10.100:
");
sb.append("32:
");
sb.append(data);
returnsb.toString();
}
}
ServerSocket没有设计获取流对象的方法
Udp的数据包丢失
服务器与浏览器的原理
计算机网络
三次握手机制
网络通信的三要素