Java网络编程与网络通信基础
Java网络编程与网络通信基础
13.1 学习目标与重点提示
学习目标:掌握Java网络编程的核心概念与通信方式,包括套接字编程、TCP/IP通信、UDP通信、HTTP通信的实现方法,学会在实际开发中处理网络通信问题。
重点:套接字编程(Socket、ServerSocket)、TCP/IP通信(服务器端、客户端)、UDP通信(DatagramSocket、DatagramPacket)、HTTP通信(URL、URLConnection)、网络编程的实际应用场景。
13.2 网络编程概述
Java网络编程是用于处理网络通信的机制。
13.2.1 网络编程的定义
定义:网络编程是用于处理网络通信的机制。
作用:
- 实现客户端与服务器之间的通信。
- 实现不同设备之间的数据传输。
- 实现网络应用程序的开发。
✅ 结论:网络编程是用于处理网络通信的机制,作用是实现客户端与服务器之间的通信、不同设备之间的数据传输、网络应用程序的开发。
13.2.2 网络编程的分类
定义:网络编程的分类是指Java中网络编程的分类方法。
分类:
- TCP/IP通信:可靠的、面向连接的通信方式。
- UDP通信:不可靠的、无连接的通信方式。
- HTTP通信:基于TCP/IP的应用层通信方式。
✅ 结论:网络编程的分类包括TCP/IP通信、UDP通信、HTTP通信。
13.3 套接字编程基础
套接字编程是Java网络编程的基础。
13.3.1 Socket与ServerSocket的定义
定义:Socket是用于表示网络连接的对象。
ServerSocket:用于表示服务器端的套接字。
常用方法:
- Socket:
- getInputStream():获取输入流。
- getOutputStream():获取输出流。
- close():关闭套接字。
- ServerSocket:
- accept():接受客户端连接。
- close():关闭服务器端套接字。
示例:
importjava.io.*;importjava.net.*;// 服务器端publicclassTCPServer{publicstaticvoidmain(String[] args){try{// 创建服务器端套接字ServerSocket serverSocket =newServerSocket(8888);System.out.println("服务器端启动成功,等待客户端连接...");// 接受客户端连接Socket socket = serverSocket.accept();System.out.println("客户端连接成功:"+ socket.getInetAddress().getHostAddress());// 获取输入流和输出流BufferedReader reader =newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriter writer =newPrintWriter(socket.getOutputStream(),true);// 读取客户端数据String message = reader.readLine();System.out.println("客户端消息:"+ message);// 发送响应数据 writer.println("服务器端已收到消息:"+ message);// 关闭资源 reader.close(); writer.close(); socket.close(); serverSocket.close();}catch(IOException e){ e.printStackTrace();}}}// 客户端publicclassTCPClient{publicstaticvoidmain(String[] args){try{// 创建客户端套接字Socket socket =newSocket("localhost",8888);System.out.println("客户端连接成功");// 获取输入流和输出流BufferedReader reader =newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriter writer =newPrintWriter(socket.getOutputStream(),true);// 发送数据 writer.println("Hello, Server!");// 读取响应数据String response = reader.readLine();System.out.println("服务器端响应:"+ response);// 关闭资源 reader.close(); writer.close(); socket.close();}catch(IOException e){ e.printStackTrace();}}}输出结果:
服务器端:
服务器端启动成功,等待客户端连接... 客户端连接成功:127.0.0.1 客户端消息:Hello, Server! 客户端:
客户端连接成功 服务器端响应:服务器端已收到消息:Hello, Server! ✅ 结论:Socket与ServerSocket是Java网络编程的基础,用于实现客户端与服务器之间的通信。
13.4 TCP/IP通信的实现
TCP/IP通信是可靠的、面向连接的通信方式。
13.4.1 服务器端的实现
定义:服务器端的实现是指Java中服务器端的网络编程方法。
示例:
importjava.io.*;importjava.net.*;// 服务器端publicclassTCPServer{publicstaticvoidmain(String[] args){try{// 创建服务器端套接字ServerSocket serverSocket =newServerSocket(8888);System.out.println("服务器端启动成功,等待客户端连接...");while(true){// 接受客户端连接Socket socket = serverSocket.accept();System.out.println("客户端连接成功:"+ socket.getInetAddress().getHostAddress());// 创建线程处理客户端请求newThread(()->{try{// 获取输入流和输出流BufferedReader reader =newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriter writer =newPrintWriter(socket.getOutputStream(),true);// 读取客户端数据String message = reader.readLine();System.out.println("客户端消息:"+ message);// 发送响应数据 writer.println("服务器端已收到消息:"+ message);// 关闭资源 reader.close(); writer.close(); socket.close();}catch(IOException e){ e.printStackTrace();}}).start();}}catch(IOException e){ e.printStackTrace();}}}✅ 结论:服务器端的实现是指Java中服务器端的网络编程方法,需要创建线程处理客户端请求。
13.4.2 客户端的实现
定义:客户端的实现是指Java中客户端的网络编程方法。
示例:
importjava.io.*;importjava.net.*;// 客户端publicclassTCPClient{publicstaticvoidmain(String[] args){try{// 创建客户端套接字Socket socket =newSocket("localhost",8888);System.out.println("客户端连接成功");// 获取输入流和输出流BufferedReader reader =newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriter writer =newPrintWriter(socket.getOutputStream(),true);// 发送数据 writer.println("Hello, Server!");// 读取响应数据String response = reader.readLine();System.out.println("服务器端响应:"+ response);// 关闭资源 reader.close(); writer.close(); socket.close();}catch(IOException e){ e.printStackTrace();}}}✅ 结论:客户端的实现是指Java中客户端的网络编程方法,需要与服务器端建立连接并发送数据。
13.5 UDP通信的实现
UDP通信是不可靠的、无连接的通信方式。
13.5.1 DatagramSocket与DatagramPacket的定义
定义:DatagramSocket是用于表示UDP套接字的对象。
DatagramPacket:用于表示UDP数据包的对象。
常用方法:
- DatagramSocket:
- send():发送数据包。
- receive():接收数据包。
- close():关闭套接字。
- DatagramPacket:
- getData():获取数据包中的数据。
- getLength():获取数据包的长度。
- getAddress():获取数据包的发送方地址。
- getPort():获取数据包的发送方端口。
示例:
importjava.io.*;importjava.net.*;// 服务器端publicclassUDPServer{publicstaticvoidmain(String[] args){try{// 创建UDP套接字DatagramSocket socket =newDatagramSocket(8888);System.out.println("服务器端启动成功,等待客户端连接...");// 创建数据包byte[] buffer =newbyte[1024];DatagramPacket packet =newDatagramPacket(buffer, buffer.length);// 接收数据包 socket.receive(packet);// 处理数据包String message =newString(packet.getData(),0, packet.getLength());System.out.println("客户端消息:"+ message);// 发送响应数据String response ="服务器端已收到消息:"+ message;byte[] responseBuffer = response.getBytes();DatagramPacket responsePacket =newDatagramPacket(responseBuffer, responseBuffer.length, packet.getAddress(), packet.getPort()); socket.send(responsePacket);// 关闭资源 socket.close();}catch(IOException e){ e.printStackTrace();}}}// 客户端publicclassUDPClient{publicstaticvoidmain(String[] args){try{// 创建UDP套接字DatagramSocket socket =newDatagramSocket();System.out.println("客户端启动成功");// 发送数据String message ="Hello, Server!";byte[] buffer = message.getBytes();InetAddress address =InetAddress.getByName("localhost");DatagramPacket packet =newDatagramPacket(buffer, buffer.length, address,8888); socket.send(packet);// 接收响应数据byte[] responseBuffer =newbyte[1024];DatagramPacket responsePacket =newDatagramPacket(responseBuffer, responseBuffer.length); socket.receive(responsePacket);String response =newString(responsePacket.getData(),0, responsePacket.getLength());System.out.println("服务器端响应:"+ response);// 关闭资源 socket.close();}catch(IOException e){ e.printStackTrace();}}}输出结果:
服务器端:
服务器端启动成功,等待客户端连接... 客户端消息:Hello, Server! 客户端:
客户端启动成功 服务器端响应:服务器端已收到消息:Hello, Server! ✅ 结论:DatagramSocket与DatagramPacket是Java中UDP通信的基础,用于实现客户端与服务器之间的通信。
13.6 HTTP通信的实现
HTTP通信是基于TCP/IP的应用层通信方式。
13.6.1 URL与URLConnection的定义
定义:URL是用于表示统一资源定位符的对象。
URLConnection:用于表示URL连接的对象。
常用方法:
- URL:
- openConnection():打开URL连接。
- getProtocol():获取协议。
- getHost():获取主机名。
- getPort():获取端口。
- getPath():获取路径。
- URLConnection:
- getInputStream():获取输入流。
- getOutputStream():获取输出流。
- setRequestProperty():设置请求属性。
- getResponseCode():获取响应码。
- getResponseMessage():获取响应消息。
示例:
importjava.io.*;importjava.net.*;// 测试类publicclassHTTPExample{publicstaticvoidmain(String[] args){try{// 创建URL对象URL url =newURL("https://www.baidu.com");// 打开URL连接URLConnection connection = url.openConnection();// 设置请求属性 connection.setRequestProperty("User-Agent","Mozilla/5.0");// 获取输入流BufferedReader reader =newBufferedReader(newInputStreamReader(connection.getInputStream()));// 读取响应数据String line;StringBuffer response =newStringBuffer();while((line = reader.readLine())!=null){ response.append(line);} reader.close();// 输出响应数据System.out.println("响应数据:"+ response.toString());}catch(IOException e){ e.printStackTrace();}}}输出结果:
响应数据:<html>...</html> ✅ 结论:URL与URLConnection是Java中HTTP通信的基础,用于实现与Web服务器之间的通信。
13.7 网络编程的实际应用场景
在实际开发中,网络编程的应用场景非常广泛,如:
- 客户端与服务器之间的通信。
- 网络文件传输。
- 网络聊天。
- 网络爬虫。
示例:
importjava.io.*;importjava.net.*;// 文件上传服务器端publicclassFileUploadServer{publicstaticvoidmain(String[] args){try{// 创建服务器端套接字ServerSocket serverSocket =newServerSocket(8888);System.out.println("服务器端启动成功,等待客户端连接...");// 接受客户端连接Socket socket = serverSocket.accept();System.out.println("客户端连接成功:"+ socket.getInetAddress().getHostAddress());// 获取输入流和输出流BufferedReader reader =newBufferedReader(newInputStreamReader(socket.getInputStream()));DataInputStream dataInputStream =newDataInputStream(socket.getInputStream());FileOutputStream fileOutputStream =newFileOutputStream("uploaded_file.txt");// 读取文件名String fileName = reader.readLine();System.out.println("文件名:"+ fileName);// 读取文件内容byte[] buffer =newbyte[1024];int length;while((length = dataInputStream.read(buffer))>0){ fileOutputStream.write(buffer,0, length);}// 关闭资源 fileOutputStream.close(); dataInputStream.close(); reader.close(); socket.close(); serverSocket.close();System.out.println("文件上传成功");}catch(IOException e){ e.printStackTrace();}}}// 文件上传客户端publicclassFileUploadClient{publicstaticvoidmain(String[] args){try{// 创建客户端套接字Socket socket =newSocket("localhost",8888);System.out.println("客户端连接成功");// 获取输入流和输出流PrintWriter writer =newPrintWriter(socket.getOutputStream(),true);DataOutputStream dataOutputStream =newDataOutputStream(socket.getOutputStream());FileInputStream fileInputStream =newFileInputStream("test.txt");// 发送文件名String fileName ="test.txt"; writer.println(fileName);// 发送文件内容byte[] buffer =newbyte[1024];int length;while((length = fileInputStream.read(buffer))>0){ dataOutputStream.write(buffer,0, length);}// 关闭资源 fileInputStream.close(); dataOutputStream.close(); writer.close(); socket.close();System.out.println("文件上传成功");}catch(IOException e){ e.printStackTrace();}}}输出结果:
服务器端:
服务器端启动成功,等待客户端连接... 客户端连接成功:127.0.0.1 文件名:test.txt 文件上传成功 客户端:
客户端连接成功 文件上传成功 ✅ 结论:在实际开发中,网络编程的应用场景非常广泛,需要根据实际问题选择合适的网络编程方法。
总结
本章我们学习了Java网络编程与网络通信基础,包括套接字编程、TCP/IP通信、UDP通信、HTTP通信的实现方法,学会了在实际开发中处理网络通信问题。其中,套接字编程(Socket、ServerSocket)、TCP/IP通信(服务器端、客户端)、UDP通信(DatagramSocket、DatagramPacket)、HTTP通信(URL、URLConnection)、网络编程的实际应用场景是本章的重点内容。从下一章开始,我们将学习Java的数据库操作、Web开发等内容。