Java网络编程:TCP通信、UDP通信

前言

本文主要讲解用如何Java语言来实现TCP通信与UDP通信。

TCP通信

TCP是面向连接的传输协议。在建立连接时需要完成三次握手,在释放连接时需要完成四次挥手。

TCP客户端

TCP客户端:向服务器发送数据,读取服务器回写的数据。

客户端实现步骤:

  1. 创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号(套接字Socket是两台机器间通信的端点);
  2. 使用Socket对象中方法getOutputStream( ) 获取网络字节输出流OutputStream对象;
  3. 使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据;
  4. 使用Socket对象中方法getInputStream( ) 获取网络字节输入流InputStream对象;
  5. 使用网络字节输出流InputStream对象中的方法read,读取服务器回写的数据;
  6. 释放资源(Socket);

代码如下:

// 1、创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
Socket socket = new Socket("IP", 8888); // IP填写为服务器IP地址
// 2、使用Socket对象中方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream os = socket.getOutputStream();
// 3、使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
os.write("Client: Hello Server!".getBytes());
// 4、使用Socket对象中方法getInputStream()获取网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
// 5、使用网络字节输出流InputStream对象中的方法read,读取服务器回写的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 6、释放资源(Socket)
socket.close();

TCP服务器端

TCP服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据。

服务器的实现步骤:

  1. 创建一个服务器ServerSocket对象和系统要指定的端口号;
  2. 使用ServerSocket对象中方法accept,获取到请求的客户端对象Socket(服务器端必须明确是哪个客户端请求的服务器,所以需要用accpet方法获取到请求的客户端对象Socket);
  3. 使用Socket对象中方法getInputStream( ) 获取网络字节输入流InputStream对象;
  4. 使用网络字节输出流InputStream对象中的方法read,读取客户端发送的数据;
  5. 使用Socket对象中方法getOutputStream( ) 获取网络字节输入流OutputStream对象;
  6. 使用网络字节输出流OutputStream对象中的方法write,读取客户端回写的数据;
  7. 释放资源(Socket, ServerSocket);

Java 代码如下:

// 1、创建一个服务器ServerSocket对象和系统要指定的端口号(端口号与客户端所设的端口号保持一致,否则无法进行连接通信)
ServerSocket server = new ServerSocket(8888);
// 2、使用ServerSocket对象中方法accept,获取到请求的客户端对象Socket
Socket socket = server.accept();
// 3、使用Socket对象中方法getInputStream()获取网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
// 4、使用网络字节输出流InputStream对象中的方法read,读取客户端发送的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 5、使用Socket对象中方法getOutputStream()获取网络字节输入流OutputStream对象
OutputStream os = socket.getOutputStream();
// 6、使用网络字节输出流OutputStream对象中的方法write,读取客户端回写的数据
os.write("Server: I get the data!Thank you!".getBytes());
// 7、释放资源(Socket, ServerSocket)
socket.close();
server.close();

注意事项:
在客户端发送数据之前,服务器端需要先运行,否则在客户端发送数据时会报错。这就是面向连接的通信,保证了数据的可靠性传输。

UDP通信

UDP是无连接的传输协议,不用与服务器进行连接,只需要知道服务器的IP和监听端口号,并向服务器发送数据即可。

UDP客户端

客户端实现步骤:

  1. 创建发送端Socket对象。构造方法:DatagramSocket( ) ;
  2. 创建数据,并将数据打包;
  3. 调用Socket对象的发送方法发送数据包;
  4. 释放资源

代码如下:

// 1、创建发送端Socket对象。构造方法:DatagramSocket()
DatagramSocket ds = new DatagramSocket();
// 2、创建数据,并将数据打包
// DatagramPacker(byte[] buf, int length, InetAddress address, int port)
String str = "Client: Hello Server!";
byte[] bytes = str.getBytes();
int len = bytes.length;
InetAddress address = InetAddress.getLocalHost(); // 获取本地IP
//InetAddress address = InetAddress.getByName("服务器域名"); // 获取服务器IP
int port = 8888;
// 打包数据
DatagramPacket dp = new DatagramPacket(bytes, len, address, port);
// 3、调用Socket对象的发送方法发送数据包 public void send(DatagramPacket p)
ds.send(dp);
// 4、释放资源
ds.close();

UDP服务器端

服务器端实现步骤:

  1. 创建接收器Socket对象 DatagramSocket(int port);
  2. 创建一个接收容器;
  3. 调用Socket对象的接收方法接收数据;
  4. 解析数据包并显示在控制台;
  5. 释放资源;

代码如下:

// 1、创建接收器Socket对象  DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(8888);
// 2、创建一个数据包 (接收容器)  DatagramPacket(byte[] buf, int length)
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
// 3、调用Socket对象的接收方法接收数据 public void receive(DatagramPacket p)
ds.receive(dp);
// 4、解析数据包并显示在控制台
// 获取对方IP public InetAddress getAddress()
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
// public byte[] getData(); 获取数据缓冲区
// public int getLength(); 获取数据的实际长度
byte[] bys2 = dp.getData();
int len = dp.getLength();
String s = new String(bys, 0, len);
System.out.println(s); // 打印收到的数据内容
// 5、释放资源
ds.close();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值