一、网络协议概述。
网络协议:为了计算机之间进行数据交互提供的一种规则和标准。在计算机网络中,每个计算机在的地理位置都不一样,为了让不同的计算机能够相互通信,故为他们定义了一种规则, 只有当其中的每台计算机都遵从这个规则,这些计算机之间才能进行通讯。举个例子,人和人之间面对面交流,他们之间都要遵守一个规则——声音在空气中传播。如果其中一个人没遵守这个规则,他说话的声音不是在空气中传播的,那么他就不能和其他的人进行交流。
二、网络协议要素。
(1)语义。语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
(2)语法。是用户数据与控制信息的结构与格式,以及数据出现的顺序。
(3)时序。时序是对事件发生顺序的详细说明。(也可称为“同步”)。
这三个要素可以简单的理解为:语义表示要做什么,语法表示怎么做,时序表示按照什么顺序做。
三、网络协议的层次划分。
四、常见的网络协议。
TCP/IP协议毫无疑问是这三大协议中最重要的一个,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。不过TCP/IP协议也是这三大协议中配置起来最麻烦的一个,单机上网还好,而通过局域网访问互联网的话,就要详细设置IP地址,网关,子网掩码,DNS服务器等参数。TCP/IP尽管是目前最流行的网络协议,但TCP/IP协议在局域网中的通信效率并不高,使用它在浏览“网上邻居”中的计算机时,经常会出现不能正常浏览的现象。此时安装NetBEUI协议就会解决这个问题。
udp协议举例:
udp接受端代码:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpDemoRec {
public static void main(String[] args){
try {
//建立socket服务并关联端口8888
DatagramSocket ds = new DatagramSocket(8888);
//封装用于接受数据的数据包
byte[] buff = new byte[1024];
DatagramPacket dp = new DatagramPacket(buff,buff.length);
//将接收的数据放到dp中
ds.receive(dp);
String address = dp.getAddress().toString();
int port = dp.getPort();
byte[] data = dp.getData();
String result = new String(data,0,dp.getLength());
System.out.println(address+":" + result + ":" + port);
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
udp发送端代码:
import java.net.*;
public class UdpDemoSend {
public static void main(String[] args){
try {
//建立Socket服务
DatagramSocket ds = new DatagramSocket();
//封装数据包
byte[] buff = "udp 协议传输".getBytes();
DatagramPacket dp =
new DatagramPacket(buff, buff.length, InetAddress.getByName("localhost"), 8888);
//发送数据包
ds.send(dp);
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
当先运行发送端时,这时接收端还没开启,代表是无连接的。发送端发送出去的数据会丢失,代表不安全。效果图:
当先运行接收端时,再运行发送端,数据就能发送到目的地。运行效果:
tcp协议举例:
tcp服务器端代码:
import java.net.*;
import java.io.*;
public class TcpServer {
public static void main(String[] args){
try {
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
String address = s.getInetAddress().toString();
System.out.println(address + "......connected");
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
String serverSay = new String(buf,0,len);
System.out.println(serverSay);
OutputStream os = s.getOutputStream();
os.write("tcp服务端——>欢迎连接".getBytes());
ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
tcp客户端代码:
import java.io.*;
import java.net.*;
public class TcpClient {
public static void main(String[] args){
try {
//创建Socket服务, 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket s = new Socket(InetAddress.getByName("localhost"),10000);
//获取客户端的输出流OutputStream,并向服务端发松数据。
OutputStream os = s.getOutputStream();
os.write("tcp客户端——>服务器,你好!".getBytes());
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
String serverSay = new String(buf,0,len);
System.out.println(serverSay);
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
当先运行客户端时,回报错,提示连接错误,这代表tcp是面向连接的,传输数据之前必须要建立连接:
当先运行服务器端时,就可以进行数据通讯了: