Java网络编程
 # 1. Java网络编程
Java网络编程是指利用Java开发网络应用,包括客户端和服务器端。Java网络编程涉及到以下几个方面:
- 网络通信:Java网络编程涉及到网络通信,包括TCP/IP协议、UDP协议、Socket编程等。
 - 网络应用开发:Java网络编程可以开发各种网络应用,如Web应用、分布式应用、游戏应用等。
 - 网络协议:Java网络编程涉及到各种网络协议,如HTTP、FTP、SMTP等。
 - 网络安全:Java网络编程涉及到网络安全,包括SSL/TLS协议、IPSec协议等。
 - 网络性能:Java网络编程可以提高网络性能,如优化网络连接、减少网络延迟等。
 
# Java网络编程框架
Java网络编程的主要框架有:
- Java Socket编程:Java Socket编程是Java网络编程的基础,它提供了TCP/IP协议的封装,可以方便地进行网络通信。
 - Java NIO(New Input/Output):Java NIO是Java网络编程的高级特性,它提供了高性能的网络通信。
 
# 2. Java Socket编程
Java Socket编程是Java网络编程的基础,它提供了TCP/IP协议的封装,可以方便地进行网络通信。Java Socket编程主要包括以下内容:
Socket类:Socket类是Java网络编程的基础,它提供了TCP/IP协议的封装,可以方便地进行网络通信。Socket类的主要方法包括connect()、bind()、close()等。
ServerSocket类:ServerSocket类用于监听客户端的连接请求,并为每个客户端创建一个Socket对象。ServerSocket类的主要方法包括accept()、close()等。
DatagramSocket类:DatagramSocket类用于发送和接收UDP协议的数据报。DatagramSocket类的主要方法包括send()、receive()等。
InetAddress类:InetAddress类用于表示IP地址。InetAddress类的主要方法包括getHostAddress()、getHostName()等。
URL类:URL类用于表示网络资源的位置。URL类的主要方法包括openConnection()、openStream()等。
# socket编程示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
    public static void main(String[] args) throws IOException {
        // 1.创建ServerSocket对象,监听端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动,监听端口:8888");
        // 2.等待客户端连接
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功:" + socket.getInetAddress().getHostAddress());
        // 3.获取输入流和输出流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
        // 4.接收客户端消息
        String message = null;
        while ((message = br.readLine())!= null) {
            System.out.println("客户端:" + message);
            // 5.发送消息给客户端
            pw.println("服务器:" + message);
        }
        // 6.关闭资源
        br.close();
        pw.close();
        socket.close();
        serverSocket.close();
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 3. Java NIO(New Input/Output)
Java NIO(New Input/Output)是Java网络编程的高级特性,它提供了高性能的网络通信。Java NIO主要包括以下内容:
- Channel类:Channel类是Java NIO的核心,它提供了非阻塞的I/O操作。Channel类的主要方法包括read()、write()等。
 - Selector类:Selector类是Java NIO的核心,它提供了多路复用(multiplexing)功能,可以同时监控多个Channel。Selector类的主要方法包括select()、wakeup()等。
 - Buffer类:Buffer类是Java NIO的核心,它提供了缓冲区,可以用于高效地读写数据。Buffer类的主要方法包括clear()、flip()、position()等。
 - Charset类:Charset类用于指定字符集,它提供了编码和解码功能。Charset类的主要方法包括forName()、encode()、decode()等。
 - CharsetDecoder类:CharsetDecoder类用于解码字符集,它提供了decode()方法。
 - CharsetEncoder类:CharsetEncoder类用于编码字符集,它提供了encode()方法。
 - ByteBuffer类:ByteBuffer类是Java NIO的缓冲区类,它提供了字节缓冲区,可以用于读写字节数据。ByteBuffer类的主要方法包括allocate()、put()、get()等。
 - MappedByteBuffer类:MappedByteBuffer类是Java NIO的缓冲区类,它提供了内存映射文件,可以直接操作文件。MappedByteBuffer类的主要方法包括load()、force()等。
 - FileChannel类:FileChannel类用于读写文件,它提供了文件指针操作、数据传输等功能。FileChannel类的主要方法包括read()、write()等。
 - SocketChannel类:SocketChannel类用于读写Socket,它提供了SocketChannel的创建、连接、读写等功能。SocketChannel类的主要方法包括connect()、read()、write()等。
 - ServerSocketChannel类:ServerSocketChannel类用于监听Socket连接请求,并为每个连接创建一个SocketChannel对象。ServerSocketChannel类的主要方法包括accept()、close()等。
 - DatagramChannel类:DatagramChannel类用于读写UDP协议的数据报,它提供了DatagramChannel的创建、连接、读写等功能。DatagramChannel类的主要方法包括connect()、read()、write()等。
 
# NIO编程示例
下面是一个简单的Java NIO编程示例,演示了如何使用Java NIO进行网络通信:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NIOExample {
    public static void main(String[] args) throws IOException {
        // 1.创建Selector对象
        Selector selector = Selector.open();    
        // 2.创建ServerSocketChannel对象,监听端口
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.bind(new InetSocketAddress(8888));
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            // 3.选择Channel
            selector.select();
            // 4.获取已选择的Channel
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();
                keyIterator.remove();
                if (key.isAcceptable()) {
                    // 5.处理新连接
                    ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
                    SocketChannel socketChannel = serverChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    // 6.处理读事件
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                    int readBytes = socketChannel.read(byteBuffer);
                    if (readBytes > 0) {
                        byteBuffer.flip();
                        byte[] bytes = new byte[byteBuffer.remaining()];
                        byteBuffer.get(bytes);
                        String message = new String(bytes, "UTF-8");
                        System.out.println("客户端:" + message);
                        // 回复客户端消息
                        byte[] response = "服务器回复:".getBytes();
                        ByteBuffer responseBuffer = ByteBuffer.allocate(response.length);
                        responseBuffer.put(response);
                        responseBuffer.put(bytes);
                        responseBuffer.flip();   
                        socketChannel.write(responseBuffer);
                    } else if (readBytes < 0) {
                        // 7.处理客户端断开连接
                        key.cancel();
                        socketChannel.close();
                    }
                }
            }
        }
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 4. 总结
Java网络编程是指利用Java开发网络应用,包括客户端和服务器端。Java网络编程涉及到以下几个方面:
- 网络通信:Java网络编程涉及到网络通信,包括TCP/IP协议、UDP协议、Socket编程等。
 - 网络应用开发:Java网络编程可以开发各种网络应用,如Web应用、分布式应用、游戏应用等。
 - 网络协议:Java网络编程涉及到各种网络协议,如HTTP、FTP、SMTP等。
 - 网络安全:Java网络编程涉及到网络安全,包括SSL/TLS协议、IPSec协议等。
 - 网络性能:Java网络编程可以提高网络性能,如优化网络连接、减少网络延迟等。
 
最后更新时间: 2024/12/26, 17:56:54