Java网络编程入门
立即解锁
发布时间: 2025-08-17 02:29:07 订阅数: 5 

### Java网络编程入门
#### 1. TCP/IP客户端 - 服务器应用
在开始TCP/IP客户端 - 服务器应用之前,需要确保TCP/IP已安装并正常工作。若机器有可用的互联网连接,那么TCP/IP正在运行。启动该应用的步骤如下:
1. 打开两个命令窗口。
2. 在一个窗口中启动服务器,另一个窗口中启动客户端(要先启动服务器,否则客户端程序可能崩溃)。
3. 若要停止`TCPEchoServer`程序,需在键盘上输入`Ctrl - C`。
#### 2. 数据报(UDP)套接字
与TCP/IP套接字不同,数据报套接字是无连接的。在对话期间,客户端和服务器之间的连接不会一直保持,每个数据报包在需要时作为独立传输发送。数据报(UDP)套接字比TCP/IP套接字传输数据更快,但不可靠。以下是UDP服务器和客户端的详细步骤:
##### 2.1 UDP服务器步骤
1. **创建`DatagramSocket`对象**:为对象的构造函数提供端口号。示例代码如下:
```java
DatagramSocket datagramSocket = new DatagramSocket(1234);
```
2. **创建用于接收数据报的缓冲区**:通过创建字节数组实现。示例代码如下:
```java
byte[] buffer = new byte[256];
```
3. **为传入的数据报创建`DatagramPacket`对象**:该对象的构造函数需要两个参数,即之前创建的字节数组和数组的大小。示例代码如下:
```java
DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length);
```
4. **接收传入的数据报**:通过`DatagramSocket`对象的`receive`方法,使用`DatagramPacket`对象作为接收器。示例代码如下:
```java
datagramSocket.receive(inPacket);
```
5. **从数据包中获取发送者的地址和端口**:使用`DatagramPacket`对象的`getAddress`和`getPort`方法。示例代码如下:
```java
InetAddress clientAddress = inPacket.getAddress();
int clientPort = inPacket.getPort();
```
6. **从缓冲区中检索数据**:为方便处理,将数据作为字符串检索,使用`String`构造函数的重载形式,该形式接受三个参数,即字节数组、数组内的起始位置(此处为0)和字节数(此处为缓冲区的完整大小)。示例代码如下:
```java
String message = new String(inPacket.getData(), 0, inPacket.getLength());
```
7. **创建响应数据报**:创建`DatagramPacket`对象,使用构造函数的重载形式,该形式接受四个参数,即包含响应消息的字节数组、响应的大小、客户端的地址和客户端的端口号。示例代码如下:
```java
DatagramPacket outPacket = new DatagramPacket(response.getBytes(), response.length(), clientAddress, clientPort);
```
8. **发送响应数据报**:通过调用`DatagramSocket`对象的`send`方法,将传出的`DatagramPacket`对象作为参数。示例代码如下:
```java
datagramSocket.send(outPacket);
```
步骤4 - 8可以在循环中无限执行。在正常情况下,服务器可能根本不会关闭。但如果发生异常,则应关闭关联的`DatagramSocket`。
9. **关闭`DatagramSocket`**:通过调用`DatagramSocket`对象的`close`方法实现。示例代码如下:
```java
datagramSocket.close();
```
以下是完整的UDP服务器代码示例:
```java
import java.io.*;
import java.net.*;
public class UDPEchoServer {
private static final int PORT = 1234;
private static DatagramSocket datagramSocket;
private static DatagramPacket inPacket, outPacket;
private static byte[] buffer;
public static void main(String[] args) {
System.out.println("Opening port...\n");
try {
datagramSocket = new DatagramSocket(PORT);
//Step 1.
} catch (SocketException sockEx) {
System.out.println("Unable to attach to port!");
System.exit(1);
}
handleClient();
}
private static void handleClient() {
try {
String messageIn, messageOut;
int numMessages = 0;
do {
buffer = new byte[256];
//Step 2.
inPacket = new DatagramPacket(buffer, buffer.length);
//Step 3.
datagramSocket.receive(inPacket);
//Step 4.
InetAddress clientAddress = inPacket.getAddress();
//Step 5.
int clientPort = inPacket.getPort();
//Step 5.
messageIn = new String(inPacket.getData(), 0, inPacket.getLength());
//Step 6.
System.out.println("Message received.");
numMessages++;
messageOut = "Message " + numMessages + ": " + messageIn;
outPacket = new DatagramPacket(messageOut.getBytes(), messageOut.length(), clientAddress, clientPort);
//Step 7.
datagramSocket.send(outPacket);
//Step 8.
} while (true);
} catch (IOException ioEx) {
ioEx.printStackTrace();
} finally {
System.out.println("\n* Closing connection... *");
datagramSocket.close();
//Step 9.
}
}
}
```
##### 2.2 UDP客户端步骤
1. **创建`DatagramSocket`对象**:与服务器程序中创建`DatagramSocket`对象类似,但构造函数不需要参数,因为将使用客户端的默认端口。示例代码如下:
```java
DatagramSocket datagramSocket = new DatagramSocket();
```
2. **创建传出的数据报**:与服务器程序的步骤7相同。示例代码如下:
```java
DatagramPacket outPacket = new DatagramPacket(message.getBytes(), message.length(), host, PORT);
```
3. **发送数据报消息**:与服务器一样,通过调用`DatagramSocket`对象的`send`方法,将传出的`DatagramPacket`对象作为参数。示例代码如下:
```java
datagramSocket.send(outPacket);
```
4. **创建用于接收数据报的缓冲区**:与服务器步骤2相同。示例代码如下:
```java
byte[] buffer = new byte[256];
```
5. **为传入的数据报创建`DatagramPacket`对象**:与服务器步骤3相同。示例代码如下:
```java
DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length);
```
6. **接收传入的数据报**:与服务器步骤4相同。示例代码如下:
```java
datagramSocket.receive(inPacket);
```
7. **从缓冲区中检索数据**:与服务器步骤6相同。示例代码如下:
```java
String response = new String(inPacket.getData(), 0, inPacket.getLength());
```
步骤2 - 7可以根据需要重复多次。
8. **关闭`DatagramSocket`**:与服务器步骤9相同。示例代码如下:
```java
datagramSocket.close();
```
以下是完整的UDP客户端代码示例:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class UDPEchoClient {
private static InetAddress host;
private static final int PORT = 1234;
private static DatagramSocket datagramSocket;
private static DatagramPacket inPacket, outPacket;
private static byte[] buffer;
public static void main(String[] args) {
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException uhEx) {
System.out.println("Host ID not found!");
System.exit(1);
}
accessServer();
}
private static void accessServer() {
try {
datagramSocket = new DatagramSocket();
//Step 1...
Scanner userEntry = new Scanner(System.in);
String message = "", response = "";
do {
System.out.print("Enter message: ");
message = userEntry.nextLine();
if (!message.equals("***CLOSE***")) {
outPacket = new DatagramPacket(message.getByt
```
0
0
复制全文
相关推荐








