Java网络编程函数的使用方法和案例讲解
发布时间:2023-06-25 08:58:04
Java网络编程是指利用JAVA语言进行网络通信的技术,它包括使用TCP和UDP协议以及Socket与ServerSocket等类实现网络通信。
一、TCP协议和Socket编程
TCP协议是一种可靠的数据传输协议,它通过三次握手建立连接,确保数据的正确传输。使用TCP协议的Socket编程,可以实现客户端与服务器之间的通信。
1. 创建客户端Socket
String ip = "localhost"; // 服务器IP地址 int port = 8000; // 服务器端口号 Socket socket = new Socket(ip, port);
2. 创建服务器端ServerSocket
int port = 8000; // 服务器端口号 ServerSocket serverSocket = new ServerSocket(port);
3. 创建输入输出流
客户端需要通过输出流向服务器端发送数据,服务器端需要通过输入流接收客户端发送的数据。
// 客户端输出流 OutputStream outputStream = socket.getOutputStream(); // 服务器端输入流 InputStream inputStream = socket.getInputStream();
4. 发送和接收数据
客户端可以通过输出流向服务器发送数据,服务器端通过输入流接收客户端发送的数据。
// 客户端发送数据 String message = "Hello Server!"; byte[] data = message.getBytes(); outputStream.write(data); // 服务器端接收数据 byte[] buffer = new byte[1024]; inputStream.read(buffer); String message = new String(buffer); System.out.println(message);
二、UDP协议和DatagramPacket编程
UDP协议是一种不可靠的数据传输协议,但是它的传输效率比TCP协议高。使用UDP协议的DatagramPacket编程,可以实现不需要连接的客户端和服务器之间的通信。
1. 创建DatagramSocket
int port = 8000; // 端口号 DatagramSocket datagramSocket = new DatagramSocket(port);
2. 创建DatagramPacket
// 发送数据
String message = "Hello Server!";
byte[] data = message.getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 8000;
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 接收数据
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(packet);
3. 发送和接收数据
// 发送数据 datagramSocket.send(packet); // 接收数据 byte[] buffer = packet.getData(); String message = new String(buffer); System.out.println(message);
三、NIO网络编程
NIO(New IO)是一种基于缓冲区、通道和选择器的高效IO操作方式,可以实现非阻塞IO。使用NIO网络编程,可以实现异步、高效的网络通信。
1. 创建Selector
Selector selector = Selector.open();
2. 创建Channel
// 创建ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8000));
serverSocketChannel.configureBlocking(false);
// 创建SocketChannel
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("localhost", 8000));
3. 注册Channel和Selector的关系
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); socketChannel.register(selector, SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE);
4. 通过Selector选择注册的Channel并处理事件
while (true) {
int select = selector.select();
if (select > 0) {
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey selectionKey : selectionKeys) {
if (selectionKey.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
} else if (selectionKey.isConnectable()) {
SocketChannel channel = (SocketChannel) selectionKey.channel();
channel.finishConnect();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
} else if (selectionKey.isReadable()) {
SocketChannel channel = (SocketChannel) selectionKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
buffer.flip();
System.out.println(new String(buffer.array()));
} else if (selectionKey.isWritable()) {
SocketChannel channel = (SocketChannel) selectionKey.channel();
String message = "Hello Server!";
ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
channel.write(buffer);
}
}
selectionKeys.clear();
}
}
总结
在JAVA网络编程中,TCP和UDP协议及Socket和DatagramPacket类是最常用的类库,使用NIO网络编程可以实现高效的非阻塞IO通信。对于不同的应用场景,可以选择适合的网络编程方式。
