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 ( ServerSocket serverSocket = new ServerSocket(8888); ) {
while(true){ 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 ( 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 ( DatagramSocket socket = new DatagramSocket(9999); ) { 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 ( 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的通信大致如上。