网络编程(十九)
网络编程(十九)
网络编程基本概念
IP地址:计算机的网络接口(通常是网卡)在网络中的唯一标识;有IPv4和IPv6两种类型
网关:负责连接多个网络,并在多个网络之间转发数据的计算机,通常是路由器或交换机
网络协议:互联网使用TCP/IP协议,它泛指互联网协议簇
TCP协议:一种面向连接,可靠传输的协议;
UDP协议:一种无连接,不可靠传输的协议。
*3次握手,4次挥手
*网络模型:OSI七层模型和TCP/IP四层模型,OSI是理想中的模型,TCP/IP是实际广泛使用的模型
TCP编程
发送字符流内容
在TCP编程中,主要使用的有Socket类,服务端使用ServerSocket,客户端使用Socket;下面是一个客户端发送内容,服务端接收的例子:
服务端
package com.netcode;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServeDemo {
public static void main(String[] args) {
try {
//开启服务端服务,指定端口
ServerSocket serverSocket = new ServerSocket(9999);
//accept()等待客户端的连接,这会阻塞后面代码的执行
Socket socket = serverSocket.accept();
//使用BufferReader获取客户端发送的数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// String s = bufferedReader.readLine();
// System.out.println(s);
String s;
while ((s=bufferedReader.readLine()) != null) {
//将收集到的客户端发送的数据打印
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
package com.netcode;
import java.io.*;
import java.net.Socket;
public class ClientDemo2 {
public static void main(String[] args) {
try {
//指定IP和端口连接远程的服务器
Socket socket = new Socket("127.0.0.1", 9999);
//创建输出流,用来向服务端发送数据
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//创建输入流,从System.in键盘输入获取要发送的内容
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s;
//这里使用while循环输入,循环发送消息
while ((s=bufferedReader.readLine())!=null) {
//向服务端发送数据
bufferedWriter.write(s);
bufferedWriter.write("\n");
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送字节流内容
除了可以发送字符内容,也可以发送图片等内容,区别就是使用字节流的方式来发送,下面的例子中,客户端发送一张图片到服务端,服务端接收到内容后,将图片保存到本地:
服务端
package com.netcode;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ReceiveFileDemo {
public static void main(String[] args) {
try {
//启动Socket服务
ServerSocket socket = new ServerSocket(9999);
//创建输入流,将远程发送的字节流写入到服务器端的文件
FileOutputStream outputStream = new FileOutputStream("src/com/netcode/wh3.png");
//开启socket监听
Socket accept = socket.accept();
//保存远程发送的字节流
InputStream inputStream = accept.getInputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=inputStream.read(bytes))!=-1) {
//读取字节流中的信息写入
outputStream.write(bytes, 0, bytes.length);
}
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
package com.netcode;
import java.io.*;
import java.net.Socket;
public class SendFileDemo {
public static void main(String[] args) {
try {
//连接远程服务器
Socket socket = new Socket("127.0.0.1", 9999);
//创建本地文件的输入流,用来读取本地文件
FileInputStream inputStream = new FileInputStream("src/com/netcode/wh1.png");
//创建输出流,用来向远程服务器发送内容
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=inputStream.read(bytes))!=-1) {
//从本地的输入流中读取内容,发送到远程服务器
outputStream.write(bytes, 0, bytes.length);
}
socket.close();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
IO流中图片的读取和写入:
FileInputStream inputStream = new FileInputStream("src/com/netcode/wh1.png");
FileOutputStream outputStream = new FileOutputStream("src/com/netcode/wh2.png");
byte[] bytes = new byte[1024];
int len;
while ((len=inputStream.read(bytes))!=-1) { //每当byte[1024]存储满了读取一次
outputStream.write(bytes, 0, bytes.length);
}
outputStream.close();
inputStream.close();
*/
UDP编程
在UDP编程中使用的是DatagrameSocket类和DatagramePackage类,Socket类用来创建通信,Package类用来携带数据。
服务端
package com.netcode;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpDemo1 {
public static void main(String[] args) throws IOException {
try {
//创建一个UDP连接
DatagramSocket socket = new DatagramSocket(6666);
//创建一个字节数组用来接收数据
byte[] bytes = new byte[1024];
//创建Package用来装载机接收到的数据
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//接收客户端发来的数据
socket.receive(packet);
//获取发送数据来的IP地址
String ip = packet.getAddress().getHostAddress();
//获取端口
int port = packet.getPort();
//获取长度
int length = packet.getLength();
//输出获取到的内容
System.out.println(new String(bytes, 0 , length)+"..."+ip+":"+port);
} catch (SocketException e) {
e.printStackTrace();
}
}
}
客户端
package com.netcode;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
public class UdpDemo2 {
public static void main(String[] args) throws IOException {
byte[] data = "Hello,World!".getBytes();
//获取要通信机器的IP地址
InetAddress inet = InetAddress.getByName("127.0.0.1");
//创建Package携带要发送的数据
DatagramPacket packet = new DatagramPacket(data, data.length, inet, 6666);
//创建UDP通信
DatagramSocket socket = new DatagramSocket();
//往指定的机器发送数据
socket.send(packet);
socket.close();
}
}
Java中网络编程的内容实用频率不多,用法也相对固定,理解逻辑上的顺序,忘记了多来看看加深记忆;最终要是巩固IO流的知识更加重要