网络编程
网络编程基础信息了解
1. IP地址
IP地址是用来标识网络中的一个通信实体(计算机、服务器等)的地址。
IP协议有IPv4和IPv6。
IPv4协议采用32位地址,8位为一个单位,以点十分制表示,如:192.168.0.1
IPv6协议次采用128位地址,16位为一个单位,每个整数用4个十六进制位表示,如:3ffa:25d4:b48c:125d:45de:4fa4:568b:57dc
注意:
- 127.0.0.1为本机地址
- 192.168.0.0~192.168.255.255为私有地址,属于非注册地址,专门为组织机构内部使用
2. 端口
端口是用来区分一台电脑上的不同程序的,用一个16位二进制整数表示,所以范围是0~65535.
3. URL
在因特网上,每一信息资源都有统一且唯一的地址,这个地址就是URL。
URL由四4部分组成:协议、存放资源的主机域名、资源文件名和端口号。
4. TCP协议
TPC协议是面向连接的,传输数据安全、稳定、效率相对较低。
实现TCP通信需要用到InetAddress类、Server Socket类、Shocket类
5. UDP协议
UDP协议是面向无连接的,传输数据不安全,但效率较高。
实现UDP通信需要用到DatagramPacket类、DatagramSocket类
常用类
1. InetAddress类
InetAddress用于封装计算机的IP地址和DNS(域名系统)
没有构造器,通过静态方法getLocalHost()、getByName()、getAllByName()、getAddress()和getHostName()实现。
2. ServerSocket类
服务器可以通过ServerSocket 类以获取一个端口,并且侦听客户端的请求。
[常用方法](Java 网络编程 | 菜鸟教程 (runoob.com))
3. Socket类
Socket(套接字)为客户端和服务器提供通信的连接。
用来实例化一个Socket对象,来获取Socket的输入输出流。
4. DatagramPacket类
DatagramPacket类表示数据报包。用来封装UDP通信的数据。
构造方法:
- DatagramPacket(byte[ ] buf, int length):构建数据报包,用来接收长度为length的数据包
- DatagramPacket(byte[ ] buf, int length, InetAddress address, int port): 构建数据报包,将长度为length的包发送到address指定主机的指定端口。
常用方法:
- getAddress(): 获取发送或接收方计算机的IP地址。
- getData(): 获取发送或接收的数据。
- setData(byte[ ] buf): 设置发送的数据.
5. DatagramSocket类
DatagramSocket类的对象可以将DatagramPacke的数据包发送到网络上,然后被客户端的DatagramSocket类对象所接收。
构造方法:
- DatagramSocket() 用于构造数据报套接字,并将其绑定到本地主机的端口。
- DatagramSocket(int port) 用于创建数据报套接字,并将其绑定到本地主机的端口。
常用方法:
- send(DatagramPacket p):从此套接字发送数据包。
- receive(DatagramPacket p): 从此套接字接收数据包。
- close():关闭此数据报套接字。
TCP通信实现聊天
//服务器端
public class TestServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader bufferedReader = null;
try {
serverSocket = new ServerSocket(8999);
socket = serverSocket.accept();
//创建向客户端发送信息的线程,并启动
new ServerThread(socket).start();
//main线程负责读取客户端发送来的数据
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str = bufferedReader.readLine();
System.out.println("客户端说:" + str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//创建服务端线程类,用来读取来自客户端的数据
class ServerThread extends Thread {
Socket socket;
BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;
public ServerThread(Socket socket) {
this.socket = socket;
try {
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//如果有在将控制台输入数据,把数据读取出来,写入Socket中
while (true) {
String str = bufferedReader.readLine();
bufferedWriter.write(str + "\n");
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//客户端
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.function.BiFunction;
public class TestClient {
public static void main(String[] args) {
Socket socket = null;
BufferedReader bufferedReader = null;
try {
socket = new Socket(InetAddress.getLocalHost(), 8999);
//创建向服务器发送信息的线程,并启动
new ClientThread(socket).start();
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//main线程负责接收服务器发来的信息
while (true) {
System.out.println("服务器说:" + bufferedReader.readLine());
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//创建客户端线程类,用来读取来自服务器的数据
class ClientThread extends Thread {
Socket socket;
BufferedReader bufferedReader;
BufferedWriter bufferedWriter;
public ClientThread(Socket socket) {
this.socket = socket;
try {
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
while (true) {
String str = bufferedReader.readLine();
bufferedWriter.write(str + "\n");
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:


UDP通信实现聊天
//客户端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Clinent {
public static void main(String[] args) throws IOException {
byte[] bytes = "Java小羊".getBytes();
//需要告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, new InetSocketAddress("localhost", 8999));
//创建数据报套接字:指定发送信息的端口
DatagramSocket datagramSocket = new DatagramSocket(9001);
//发送数据报包
datagramSocket.send(datagramPacket);
//关闭资源
datagramSocket.close();
}
}
//服务器端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws IOException {
//创建数据套接字
DatagramSocket datagramSocket = new DatagramSocket(8999);
byte[] bytes = new byte[1024];
//创建数据包,指定要接收的数据的缓冲位置和长度
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//接收客户端发送的数据报
datagramSocket.receive(datagramPacket);//阻塞式方法
// datagramPacket.getLength();返回实际收到的数据的字节数
String str = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(str);
//关闭资源
datagramSocket.close();
}
}
运行结果:


浙公网安备 33010602011771号