《Java TCP/IP Socket编程》读书笔记(10)

3.5.3.3 基于文本编解码和UDP套接字


客户端

package com.suifeng.tcpip.chapter3.vote;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;

/**
 * UDP 客户端
 * 
 * @author Suifeng
 * 
 */
public class VoteUDPClient
{
	// 超时时间
	private static final int TIMEOUT = 3000;
	// 最大连接次数
	private static final int MAXTRIES = 5;

	public static void main(String[] args) throws IOException
	{
		if (args.length != 3)
		{
			throw new IllegalArgumentException("Paramters:<Server> <Port> <Candidate>");
		}

		// 服务器地址
		InetAddress serverAddress = InetAddress.getByName(args[0]);
		// 服务器端口
		int serverPort = Integer.parseInt(args[1]);
		// 候选人编号
		int candidate = Integer.parseInt(args[2]);

		// UDP客户端
		DatagramSocket socket = new DatagramSocket();
		socket.connect(serverAddress, serverPort);
		// 接收数据阻塞时间
		socket.setSoTimeout(TIMEOUT);

		System.out.println("UDP 客户端已建立....");

		VoteMsg vote = new VoteMsg(false, false, candidate, 0);
		VoteMsgCoder coder = new VoteMsgTextCoder();

		byte[] encodeVote = coder.toWire(vote);
		System.out.println("Sending Text-encode Request (" + encodeVote.length + "bytes)");
		System.out.println(vote);

		DatagramPacket message = new DatagramPacket(encodeVote, encodeVote.length);
		socket.send(message);

		message = new DatagramPacket(new byte[VoteMsgTextCoder.MAX_WIRE_LENGTH], VoteMsgTextCoder.MAX_WIRE_LENGTH);
		socket.receive(message);
		
		encodeVote = Arrays.copyOfRange(message.getData(), 0, message.getData().length);
		System.out.println("Received Text-encoded Response ("+encodeVote.length+" bytes)");
		
		vote = coder.fromWire(encodeVote);
		System.out.println(vote);
		
	}

}

服务器端

package com.suifeng.tcpip.chapter3.vote;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Arrays;

/**
 * UDP服务器端
 * 
 * @author Suifeng
 * 
 */
public class VoteUDPServer
{

	// 最大显示数组字节数
	private static final int ECHO_MAX = 255;

	public static void main(String[] args) throws IOException
	{
		if (args.length != 1)
		{
			throw new IllegalArgumentException("Parameter:<Port>");
		}

		// 服务器端口
		int serverPort = Integer.parseInt(args[0]);
		
		// 服务器端
		DatagramSocket socket = new DatagramSocket(serverPort);
		
		
		System.out.println("UDP服务器已启动....");
		
		VoteMsgCoder coder = new VoteMsgTextCoder();
		VoteService service = new VoteService();
		byte[] inBuffer =new byte[VoteMsgTextCoder.MAX_WIRE_LENGTH];
		
		while (true)
		{
			System.out.println("正在等待客户端发送数据....");
			// 数据报
			DatagramPacket packet = new DatagramPacket(inBuffer, inBuffer.length);
			// 接收客户端发送的数据(阻塞)
			socket.receive(packet);

			byte[] encodeMsg = Arrays.copyOfRange(packet.getData(), 0, packet.getData().length);
			System.out.println("Handing request from "+packet.getSocketAddress()+ " ("+encodeMsg.length+")");
			
			VoteMsg msg = coder.fromWire(encodeMsg);
			msg = service.handleRequest(msg);
			
			packet.setData(coder.toWire(msg));
			System.out.println("Sending Resoponse ("+packet.getLength()+" bytes");
			System.out.println(msg);
			
			socket.send(packet);
		}
	}

}

启动服务器端,监听39393端口


启动客户端


查看服务端


再次启动客户端


再次查看服务器端


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值