1、网络是什么
1.1 计算机网络
为实现资源共享和信息传递,通过通信信路连接起来的若干主机(Host)
常见计算机网络:
- 互联网:(Internet)点与点相连。
- 万维网:(WWW – World Wide Web)端与端相连。
- 物联网:( IoT - Internet of things) 物与物相连。
- 网络编程:让计算机与计算机之间建立连接、进行通信。
1.2 网络模型
OSI(Open System Interconnect),即开放式系统互联
该体系结构标准定义了网络互联的七层架构
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层)
2、TCP、UDP
2.1 TCP【重点
】
TCP协议:Transmission Control Protocol 传输控制协议:
- 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手。
2.2 UDP
UDP协议:User Datagram Protocol 用户数据报协议:
- 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB。
3、基于TCP、UDP编程
3.1 TCP编程
package Day23_Socket.tcp4;
import Day23_Socket.utils.IOUtils;
import java.io.*;
import java.net.Socket;
/**
* @Author wzy
* @Date 0017 2020-12-17 11:46
* @Version 1.0
*/
public class readThread extends Thread{
private BufferedReader br;
private Socket socket;
public readThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
try{
while (true){
String str = br.readLine();
if (str!=null){
System.out.println(str);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(br,socket);
}
}
}
package Day23_Socket.tcp4;
import Day23_Socket.utils.IOUtils;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* @Author wzy
* @Date 0017 2020-12-17 11:46
* @Version 1.0
*/
public class writeThread extends Thread{
private BufferedReader br;
private BufferedWriter bw;
private String name;
private Socket socket;
public writeThread(Socket socket, String name) throws IOException {
this.socket=socket;
this.name=name;
this.bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
this.br =new BufferedReader(new InputStreamReader(System.in));
}
@Override
public void run() {
try{
while (true){
bw.write(name+":"+br.readLine());
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(bw,socket);
}
}
}
package Day23_Socket.tcp4;
import java.io.IOException;
import java.net.Socket;
/**
* @Author wzy
* @Date 0017 2020-12-17 10:25
* @Version 1.0
*/
public class Client {
public static void main(String[] args) throws IOException {
//1.连接服务器
Socket socket = new Socket("127.0.0.1",8888);
//开启读取数据的线程
new readThread(socket).start();
//开启输出数据的线程
new writeThread(socket,"客户端").start();
}
}
package Day23_Socket.tcp4;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author wzy
* @Date 0017 2020-12-17 10:21
* @Version 1.0
*
* 服务器:
* 三次握手
* 1.客户端发送数据给接收方
* 2.服务器接收来自客户端的数据,并返回数据
* 3.客户端接收到来自服务器的数据
*
* 一对一通讯
*/
public class Server {
public static void main(String[] args) throws IOException {
//1.建立服务器的套接字
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
//开启读取数据的线程
new readThread(socket).start();
//开启输出数据的线程
new writeThread(socket,"服务器").start();
}
}
3.2 UDP编程
客户端1和客户端2之间的信息互传
package Day23_Socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @Author wzy
* @Date 0017 2020-12-17 15:22
* @Version 1.0
*/
public class Client1 {
public static void main(String[] args) throws IOException {
//1.创建一个包含端口号的udp套接字
DatagramSocket socket = new DatagramSocket(8888);
//发送数据
//把需要发送的数据存储到字节数组中
byte[] b = "客户端1:你就是个渣渣".getBytes();
//创建数据包
DatagramPacket packet = new DatagramPacket(b, b.length, InetAddress.getByName("127.0.0.1"), 9999);
//发送数据包
socket.send(packet);
//接收数据
b = new byte[1024];
packet = new DatagramPacket(b,b.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
}
}
package Day23_Socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @Author wzy
* @Date 0017 2020-12-17 15:22
* @Version 1.0
*/
public class Client2 {
public static void main(String[] args) throws IOException {
System.out.println("客户端2即将运行...");
DatagramSocket socket = new DatagramSocket(9999);
//接收数据
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b,b.length);
//接收数据报包 -- 阻塞
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
//发送数据
b = "客户端2:我劝你善良".getBytes();
packet = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),8888);
socket.send(packet);
}
}