通信协议
通信规则,包含TCP和UDP协议,其中TCP是面向连接的协议,UDP是无连接的协议
相关知识点总结:
ip:
网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。
1.
A类IP地址bai 一个A类IP地址du由1字节的网络zhi地址和3字节主机地址组成,网络地址的最高位必dao须是“0”,
地址范围从1.0.0.0
到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多(2的24次方)个主机。
2.
B类IP地址 一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机
。
3.
C类IP地址 一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
4.
D类地址用于多点广播(Multicast)。 D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
5.
E类IP地址 以“llll0”开始,为将来使用保留。 全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。 在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下: A类地址:10.0.0.0~10.255.255.255 B类地址:172.16.0.0~172.31.255.255 C类地址:192.168.0.0~192.168.255.255
端口(port):是计算机与外界通讯交流的出口
UDP传输
发送数据:
a、建立UDPSocket服务,在此无需指定端口,也可以将端口加入。如果不指定的话,系统会随机分配一个端口,如第一次运行时端口为1093,那么第二次就会顺延为1094,再运行会一直顺延,因为之前的端口还没有得到释放,所以会顺延端口号值。
b、提供数据,并将数据封装到数据包中
c、通过socket服务的发送功能,将数据包发送出去
d、关闭资源
2)接收数据:
a、定义UDPSocket服务。通常会监听一个端口,其实就是给这个接收网路应用程序定义数字标识,方便于明确哪些数据过来该应用程序可以处理。
b、定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
c、通过socket服务的receive方法接收到的数据存入已定义好的数据包中
d、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
e、关闭资源
在定义接收数据的方法中,仍会在DatagramSocket构造函数中传入DatagramPacket的参数,这是因为收到的数据太多,需要解析,通过将数据封装成对象,易于解析,所以需要传入参数。
注意:
1、发送端与接收端是两个独立的运行程序。
2、在发送端,要在数据包对象中明确目的地IP及端口。
3、在接收端,要指定监听的端口。
package com.net;
import java.io.*;
import java.net.*;
class UdpS implements Runnable{
private DatagramSocket ds;
UdpS(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket dp= null;
while((line= br.readLine())!= null){
byte[] buf = line.getBytes();
dp = new DatagramPacket(buf,
buf.length,
InetAddress.getByName("127.0.0.1"),
10000
);
ds.send(dp);
}
}
catch(Exception e){
throw new RuntimeException("读写失败!");
}
}
}
class UdpR implements Runnable{
private DatagramSocket ds = null;
UdpR(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try{
byte[] buf = new byte[1024];
DatagramPacket dp = null;
while(true){
dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
int port = dp.getPort();
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+"接受的数据时:"+data);
}
}catch(Exception e ){
throw new RuntimeException("接受数据失败!");
}
}
}
public class UdpChat{
public static void main(String[] args) throws Exception {
new Thread(new UdpS(new DatagramSocket())).start();
new Thread(new UdpR(new DatagramSocket(10000))).start();
}
}
TCP传输
TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket。
方法:
创建客户端对象:
Socket():创建空参数的客户端对象,一般用于服务端接收数据
Socket(String host,int port),指定要接收的IP地址和端口号
2)创建服务端对象:ServerSocket(int port):指定接收的客户端的端口
3)Socket accept():监听并接受到此套接字的连接
4)void shutdownInput():此套接字的输入流至于“流的末尾”
5)void shutdownOutput():禁用此套接字的输出流
6)InputStream getInputStream():返回此套接字的输入流,Socket对象调用
7)OutputStream getOutputStream():返回套接字的输出流,Socket对象调用
//客户端
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建Socket服务
Socket s=new Socket("127.0.0.1",10000);
//定义读取流读取文件数据
BufferedReader br=new BufferedReader(new FileReader("TcpDemo.java"));
//定义目的,将数据写入到Socket输出流。发给服务端
//BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//定义一个Socket读取流,读取服务端返回信息。
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while ((line=br.readLine())!=null)
{
pw.println(line);
}
s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.
System.out.println(brin.readLine());//接收返回信息
br.close();
s.close();
}
}
//服务端
class TcpServer
{
public static void main(String[] args)throws Exception
{
//创建服务端的ServerSocket服务,并指定监听端口
ServerSocket ss =new ServerSocket(10000);
//获取客户端连接
Socket s=ss.accept();
//获取客户端ip
System.out.println(s.getInetAddress().getHostName()+" connected.......");
//读取Socket读取流中的数据
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
//将接收到的数据写入文件中
PrintWriter out=new PrintWriter(new FileWriter("TcpDemo.txt"),true);
//将返回信息写入Socket流的写入流中
BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line=null;
while ((line=brin.readLine())!=null)
{
out.println(line);
}
//PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
//pw.println("上传成功");
bwout.write("上传成功!");
bwout.newLine();//换行
bwout.flush();//刷新
out.close();//关流
s.close();
ss.close();
}
}
zero copy
netty
同步异步
阻塞/非阻塞
缓冲区
tcp协议栈
reset by peer exception