Java网络编程怎么通过TCP和UDP实现

先介绍一下TCP和UDP两种连接方式的区别,TCP连接是类似于打电话一样的,你拨一个已经存在的号码,然后对方接听了你们就可以进行通话,彼此间是一个连通状态,这种方式可靠性很好,你说的话对方都能回复,你能判断对方是否接收到你的消息。而UDP则类似于发信息和发邮件一样的方式,朝着某个地址发数据,对方收不收得到也不管,这种方式可靠性较低,数据有丢失风险并且自身也不会知道。

下面开始演示Java如何两种方式的连接:

TCP

定义一个服务端类:

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
package com.huajieyu.code.y2024.sept.at0915d;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

public static void main(String[] args) {
try (
// 创建服务端对象,用于接收客户端的请求,并把服务端口设置为8888
ServerSocket serverSocket = new ServerSocket(8888);
) {

while(true){
// 调用accept等待被连接
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String string = br.readLine();
System.out.println("From client:" + string);
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

定义一个客户端类:

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
package com.huajieyu.code.y2024.sept.at0915d;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TCPClient {

public static void main(String[] args) throws IOException {

String host = "127.0.0.1";
int port = 8888;
InetAddress address = InetAddress.getByName(host);
try (
// 定义客户端的服务,连接本地的8888端口
Socket socket = new Socket(address, port);
OutputStream outputStream = socket.getOutputStream();
) {

// 给服务端发送一句话
outputStream.write("你好老兄!".getBytes());

Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}

下面把两个类启动,客户端一启动就需要连接服务端,所以需要先启动服务端的代码。

再启动客户端,会发现服务端的控制台接收到消息,服务端有while(true)所以会一直挂着等待客户端的请求。客户端启动后会给服务端发送消息然后正常结束。但是服务端还在启动着,客户端可以执行多次,能给服务端发送多次消息,下面是执行了3次的效果:

1
2
3
From client:你好老兄!
From client:你好老兄!
From client:你好老兄!

UDP

创建一个发送端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.huajieyu.code.y2024.sept.at0915d;

import java.net.*;

public class UDPServer {

public static void main(String[] args) {
try (
// 创建服务端对象,用于接收客户端的请求,并把服务端口设置为9999
DatagramSocket socket = new DatagramSocket(9999);
) {
// 为了演示,这里加个while循环重复发送消息
while (true) {
String str = "Hello UDP client";
// 指定数据和发送的目标位置
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("localhost"), 9888);
socket.send(dp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

创建一个接收端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.huajieyu.code.y2024.sept.at0915d;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPClient {

public static void main(String[] args) {
try (
// 创建接收端对象,用于接收发送端的数据,把服务端口设置为9888
DatagramSocket socket = new DatagramSocket (9888);
) {
byte [] bytes = new byte[24];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
socket.receive(dp);

byte[] data = dp.getData();
String str = new String(data);
System.out.println("接收到消息:" + str);
} catch (Exception e) {
e.printStackTrace();
}
}
}

启动的时候先启动哪一个都行。但是如果先启动了接收端,那么很快就会结束了,啥也没收到,因为消息还没开始发。所以建议先启动发送端,发送端如果只发送一次,此时如果接收端没有启动,那这个就不知道该往哪里发,程序很快也会结束。除非说发送端和接收端恰好同时在运行,这样接收端和发送端才能正常处理消息。所以为了演示我这里把发送端的发送逻辑给重复执行,先启动发送端,然后再启动接收端,此时接收端就能正常接收消息了。

效果如下:

1
2
3
接收到消息:Hello UDP client        

Process finished with exit code 0

TCP/UDP的通信大致如上。


今日总访问量 加载中…
今日总访客数 加载中…
本站总访问量 加载中…
本站总访客数 加载中…
本页总阅读量 加载中…
本页总访客数 加载中…