《Java TCP/IP Socket编程》读书笔记(10)
2013-01-28 23:08
288 查看
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端口
启动客户端
查看服务端
再次启动客户端
再次查看服务器端
相关文章推荐
- 《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(10)
- 读书笔记 effective c++ Item 10 让赋值运算符返回指向*this的引用
- Solaris 10 Advance Administrator 310-202 读书笔记 第二章 Describing the Client-Server Model(1)
- 《德鲁克管理思想精要》读书笔记10 - 沟通,领导力,创新的原则
- Solaris 10 Advance Administrator 310-202 读书笔记 第四章 ---- Manager Swap Configuration
- 【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)
- 《设计模式之禅》读书笔记--(10)命令模式
- 机器学习实战 - 读书笔记(10) - 利用K-均值聚类算法对未标注数据分组
- PCIE协议解析 synopsys IP Power Management Capability 读书笔记(10)
- 2015.03.12,外语,读书笔记-《Word Power Made Easy》 10 “如何讨论交谈习惯”学习笔记 SESSION 24
- effective C++ 10_令operator=返回一个reference to *this 读书笔记
- 编写高质量代码改善C#程序的157个建议读书笔记【1-10】
- Effective C++ 读书笔记(10)
- Javascript Patterns--读书笔记10 (Decorator)
- 读书笔记10:外观模式
- 《黑客与画家》读书笔记(10-15章)
- 《Effective java》读书笔记10——序列化
- Solaris 10 Advance Administrator 310-202 读书笔记 第十五章 ---- Introduction to Zones
- 不要在Unix下遍桌面程序(2)《精通Unix下C语言与项目实践》读书笔记(10) 推荐
- 《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制