网络编程
2021-03-24
3 min read
基本知识
- 计算机网络:由两台或更多计算机组成的网络
- 互联网:连接网络的网络
- TCP/IP协议泛指互联网协议,只有使用TCP/IP协议的计算机才能够联入互联网
- IP地址分为IPv4和IPv6两种,有一个特殊的IP地址,称为本机地址(localhost),总是127.0.0.1
- 域名:因为直接记忆IP地址非常困难,所以我们通常使用域名访问某个特定的服务
- 网络模型(osi七层模型)
网络通信的要素
- IP地址 和 端口
- IP地址:计算机的网络接口(通常是网卡)在网络中的唯一标识
- 端口:每个应用程序对应一个端口号
- 网络协议:TCP协议 和 UDP协议
- TCP协议:一种面向连接,可靠传输的协议
- UDP协议:一种无连接,不可靠传输的协议
TCP
- 服务器端:用ServerSocket监听指定端口
//服务器端
public class TcpServerDemo2 {
public static void main(String[] args) throws IOException {
//创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//监听客户端的链接
Socket socket = serverSocket.accept();
//读取文件
InputStream is = socket.getInputStream();
//写出文件
FileOutputStream fos = new FileOutputStream("receive.png");
int len;
while ((len = is.read()) != -1) {
fos.write(len);
}
//关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
- 客户端 :用Socket(InetAddress, port)连接服务器
//客户端
public class TcpClientDemo2 {
public static void main(String[] args) throws IOException {
//创建一个Socket链接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//创建一个输出流
OutputStream os = socket.getOutputStream();
//读取文件
FileInputStream fis = new FileInputStream(new File("lol.png"));
//写出文件
int len;
while ((len = fis.read()) != -1) {
os.write(len);
}
//关闭资源
fis.close();
os.close();
socket.close();
}
}
UDP
public class UdpServer {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket socket = new DatagramSocket(8090);
//接受数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,packet.getData().length));
//关闭连接
socket.close();
}
}
public class UdpClient {
public static void main(String[] args) throws Exception {
//建立一个socket
DatagramSocket socket = new DatagramSocket();
//建包
String msg = "上善若水,水善利万物而不争!";
InetAddress IP = InetAddress.getByName("localhost");
int port = 8090;
//参数(数据,数据的起始、长度,发送的地址)
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,
msg.getBytes().length,IP,8090);
//发送包
socket.send(packet);
//关闭资源
socket.close();
}
}