目录
学习背景
地点:长沙欧富安科技园1栋5楼飞思
时间:23年7月24~30号
大致内容:TCP,UDP
前言
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来,主要围绕TCP(传输控制协议)和UDP(用户数据报协议)这两个协议进行。
网络编程
网络通信协议
协议
要使计算机连成的网络能够互通信息,需要对数据传输速率、传输代码、代码结构、传输控制步骤、出错控制等制定一组标准,这一组共同遵守的通信标准就是网络通信协议,不同的计算机之间必须使用相同的通讯协议才能进行通信。
七层模型
也称为OSI参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
TCP/IP协议
在Internet中TCP/IP协议是使用最为广泛的通讯协议。
应用层
应用程序之间如何相互传递报文,比如HTTP协议,FTP协议
运输层
传输层的作用是为两台主机之间的"应用进程"提供端到端的逻辑通信,比如TCP协议
网络层
网络层互联层提供了主机到主机的通信,将传输层产生的数据包封装成分组数据包发送到目标主机,并提供路由选择能力. IP协议是网络层的主要协议,TCP和UDP都是用IP协议作为网络层协议.这一层的主要作用是给包加上源地址和目标地址,将数据包传送到目标地址.
网络接口层
网络访问层也可以称为网络接口层,以太网,WIFI,蓝牙就是工作在这一层,网络访问层提供了主机连接到物理网络需要的硬件和相关协议
TCP协议
TCP/IP协议(定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准):
1.Internet上不同系统之间互联的一组协议
2.为分散和不同类型的硬件提供通用的编程接口。
3.TCP/IP协议使Internet尽可能成为一个分散、无序的网络。
4.TCP是基于(面向)连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。
“三次握手”
1、在第一次通信过程中,客户端向服务器发送信息之后,服务器收到信息后可以确认自己的收信能力和客户端的发信能力没有问题。
2、在第二次通信中,服务器向客户端发送信息之后,客户端可以确认自己的发信能力和服务器的收信能力没有问题,但是服务器不知道自己的发信能力到底如何,所以就需要第三次通信。
3、在第三次通信中,客户端向服务器发送信息之后,服务器就可以确认自己的发信能力没有问题。
IP地址
IP地址:网络中每台计算机的一个标识号,在实际中可以使用127.0.0.1表示本机,或者直接使用localhost代表本机
IP地址分为5类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数据不同。
端口号:具有网络功能的应用软件的标识号,TCP和UDP的端口互不相干
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的
1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。
网络通信的实现
Socket编程
1.套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
2.当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
3.java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
Socket通信
1.流式套接字
提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收,其实他对应使用的是TCP协议
2.数据报式套接字
面向无连接,数据报以独立包形式发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序无序,其实他对应使用的是UDP协议
3.原始式套接字
该接口允许对较低层次协议,如IP直接访问。可以接收本机网卡上的数据帧或数据包,对监听网络流量和分析很有用
TCP协议通信
服务端代码
/**
* 服务端
*
*/
public class Server {
public static void main(String[] args) {
ServerSocket server = null;
Socket socket = null;
try {
//准备服务器端用的通讯对象(套接字),指明端口号为8080
server = new ServerSocket(8080);
//到指定端口去阻塞监听,一旦有客户端请求发送过来,那么立即自动与客户端建立连接
socket = server.accept();
System.out.println("服务器端准备ok");
//我要发送到客户端的内容
String msg = "我是服务器";
OutputStream os = socket.getOutputStream();//准备输出对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(msg);
bw.newLine();
bw.flush();
//接收客户端发送的信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply = br.readLine();
System.out.println("我是服务器,接收到信息:"+reply);
br.close();
is.close();
bw.close();
os.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
/**
* 客户端
*
*/
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 8080);
System.out.println("客户端准备完成");
//客户端开始接受请求
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg = br.readLine();
System.out.println("我是客户端,接收到信息:"+msg);
//客户端接收到服务器端的信息之后,需要反馈信息给服务器
//客户端想要反馈给服务器端的信息
String reply = "我是客户端,收到你的信息";
OutputStream os = socket.getOutputStream();//准备客户端的输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(reply);
bw.newLine();
bw.flush();
bw.close();
os.close();
br.close();
is.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDP协议通信
服务器代码
public class Server {
public static void main(String[] args) {
try {
DatagramSocket server = new DatagramSocket(8080);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
server.receive(packet);
System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + new String(packet.getData()));
packet.setData("Hello Client".getBytes());
packet.setPort(5070);
packet.setAddress(InetAddress.getLocalHost());
server.send(packet);
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
public class Client {
public static void main(String[] args){
try {
DatagramSocket client = new DatagramSocket(8080);
DatagramPacket packet = new DatagramPacket(new byte[1024],1024);
packet.setPort(5060);
packet.setAddress(InetAddress.getLocalHost());
packet.setData("Hello Server".getBytes());
client.send(packet);
client.receive(packet);
System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + new String(packet.getData()));
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}