(一)、网络编程概述
引入
什么是网络?
通过通信线路(网线,交换机等)把不同地理区域的计算机连接起来
继而通过特定软件来实现资源共享和信息传递的系统
网络编程
使开发的程序可以借助网络在其他计算机之间进行数据传输
Java是Internet上的语言(java语言支持网络传输),在java中,将连接网络的底层细节都封装好了,通过API提供给程序员,程序员可以使用这些封装类,轻松开发出具有网路通信的软件(程序员面对的是一个统一的网络1编程环境)
目的:实现与其他计算机的通讯,通过网络协议
问题:定位主机、数据传输
(二)、网络模型
OSI参考模型(理想模型七层)
TCP/IP参考模型(实际模型四层)
应用层
传输层
网络层
链路层
(三)、网络通信要素:IP,端口号,通信协议
IP
IP地址(Internet Protocol Address)是指互联网协议地址
ip---->寻址(每个主机都有一个ip(局域网ip,广域网ip))
本地回环地址(hostAddress):127.0.0.1 ,它代表设备的本地虚拟接口, 访问自己电脑的,
端口号
端口号是与计算机上的程序对应的 ,每个运行中的程序都会分配一个端口号,不能重复
端口号范围是0-65535 0-1024被系统占用 定义时1024-65535
通信协议
计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、 传输控制步骤、出错控制等制定标准
两个非常重要的协议(传输层协议):
传输控制协议TCP(Transmission Control Protocol)
客户端—>服务器
使用TCP协议前,必须先测试网络是否通畅
传输前:三次握手
在连接中可进行大数据量的传输
传输完毕:需释放已建立的连接,效率低
断开时:四次挥手
用户数据报协议UDP(User Datagram Protocol)
将数据、源、目的封装成数据包
不需要建立连接
每次就只管发送,发送失败或者成功,都不知道
速度快,不可靠
(四)、TCP编程
TCP编程概述
(一)、通信的两端都要有Socket,
Socket 客户端
ServerSocket 服务器端
(二)、网络通信其实就是Socket间的通信
先启动服务器
再启动客户端
服务器端,有一个监听程序
监听到了,获取到对应的客户端程序
(三)、Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
TCP编程步骤
服务器端
创建服务器,指定端口
设置监听
获取输入流
获取输出流
数据传输
客户端断开,关闭ServerSocket和Socket对象
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动成功");
Socket socket = serverSocket.accept();
//客户端离线报异常
System.out.println("客户端连接成功");
//获取输出流
OutputStream out = socket.getOutputStream();
DataOutput dataout = new DataOutputStream(out);
InputStream in = socket.getInputStream();
DataInputStream datain = new DataInputStream(in);
Scanner sc = new Scanner(System.in);
while(true){
// 一方一次只能说一句
System.out.println("客户端说:"+datain.readUTF());
System.out.println("服务器输入:");
String str = sc.next();
try{
dataout.writeUTF(str);
}catch(IOException ie){
ie.printStackTrace();
System.out.println("客户端离线");
}
}
}
}
客户端
创建客户端
获取输出流
数据传输
关闭Socket,释放线路
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",6666);
Scanner sc = new Scanner(System.in);
//获取输出流对象
OutputStream out = socket.getOutputStream();
DataOutputStream dataout = new DataOutputStream(out);
InputStream in = socket.getInputStream();
DataInputStream datain = new DataInputStream(in);
while(true){
System.out.println("客户端输入:");
String str = sc.next();
dataout.writeUTF(str);
if(str.equals("886")){
break;
}
System.out.println("服务器说:"+datain.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("网络连接失败");
}
}
}
(五)、UDP编程
UDP编程概述
DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序
DatagramSocket 负责发送和接收数据
不保证UDP数据报一定能够安全送到目的地、不能确定什么时候可以抵达
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接
UDP编程
步骤
DatagramSocket(负责发送和接收数据)
DatagramPacket(封装数据报)
建立发送端,接收端
数据发送–>数据接收
关闭Socket
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receive {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(6666);
byte [] b = new byte[1024];
while(true){
DatagramPacket datagramPacket = new DatagramPacket(b,b.length);
//接收数据
datagramSocket.receive(datagramPacket);
// 数据 从什么位置开始 长度
String s = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println(s);
}
}
}
发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Send {
public static void main(String[] args) throws IOException {
//负责发送和接收数据
DatagramSocket datagramSocket = new DatagramSocket();
while (true){
//数据报封装
String s = "你好 接收端";
// 数据 长度 IP地址 端口号
DatagramPacket datagramPacket = new DatagramPacket(s.getBytes(),s.getBytes().length, InetAddress.getByName("127.0.0.1"),6666);
datagramSocket.send(datagramPacket);//发送数据
}
//datagramSocket.close();//关闭
}
}