Netty学习之二--Java socket编程(UDP实例)
2017-05-11 20:11
441 查看
1.UDP和TCP的区别
(TCP)传输控制协议,是一种提供可靠数据传输的通用协议,由于TCP需要建立真实的连接,所以需要消耗服务器的负载要大于UDP (UDP)用户数据报协议,是一个面向无连接的协议。采用该协议不需要两个应用程序先建立连接。UDP协议不提供差错恢复,不能提供数据重传,因此该协议传输数据安全性差。
2.UDP 编程
1.服务器代码package com.ly.netty.scoket.N03.server;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Server {
private byte[] buf = new byte[1024];
private DatagramPacket dp_receive = new DatagramPacket(buf, buf.length);
public Server() {
try {
//客户端在8888端口监听接收到的数据
DatagramSocket socket = new DatagramSocket(8888);
System.out.println("Server started!");
boolean f = true;
while (f) {
socket.receive(dp_receive);
//接收到客户端的消息
String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
" from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
System.out.println(str_receive);
String str_send = "Hello I am server!" ;
DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),dp_receive.getAddress(),9000);
socket.send(dp_send);
}
socket.close();
} catch (SocketException e) {
System.err.println("Can't open socket");
System.exit(1);
} catch (IOException e) {
System.err.println("Communication error");
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server();
}
}
2.客户端代码
package com.ly.netty.scoket.N03.client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
private byte[] buf = new byte[1024];
private static final int TIMEOUT = 1000; // 设置接收数据的超时时间
private static final int MAXNUM = 10; // 设置重发数据的最多次数
private void sendMessage(String msg) throws Exception {
// 客户端在9000端口监听接收到的数据
DatagramSocket ds = new DatagramSocket(8889);
InetAddress loc = InetAddress.getLocalHost();
// 定义用来发送数据的DatagramPacket实例
DatagramPacket dp_send = new DatagramPacket(msg.getBytes(),
msg.length(), loc, 8888);
// 定义用来接收数据的DatagramPacket实例
DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
// 数据发向本地9000端口
ds.setSoTimeout(TIMEOUT); // 设置接收数据时阻塞的最长时间
int tries = 0; // 重发数据的次数
boolean response = false; // 是否接收到数据的标志位
// 直到接收到数据,或者重发次数达到预定值,则退出循环
while (!response && tries < MAXNUM) {
// 发送数据
ds.send(dp_send);
try {
ds.receive(dp_receive);
// 如果接收到的数据不是来自目标地址,则抛出异常
if (!dp_receive.getAddress().equals(loc)) {
throw new IOException(
"Received packet from an umknown source");
}
// 如果接收到数据。则将receivedResponse标志位改为true,从而退出循环
response = true;
} catch (Exception e) {
// 如果接收数据时阻塞超时,重发并减少一次重发的次数
tries += 1;
System.out.println("Time out," + (MAXNUM - tries)
+ " more tries...");
}
}
if (response) {
String str_receive = new String(dp_receive.getData(), 0,
dp_receive.getLength())
+ " from "
+ dp_receive.getAddress().getHostAddress()
+ ":"
+ dp_receive.getPort();
System.out.println(str_receive);
System.out.println(str_receive);
// 由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
// 所以这里要将dp_receive的内部消息长度重新置为1024
dp_receive.setLength(1024);
}else{
//如果重发MAXNUM次数据后,仍未获得服务器发送回来的数据,则打印如下信息
System.out.println("No response!");
}
ds.close();
}
public static void main(String[] args) throws Exception {
Client client = new Client();
String msg = "Hello I am client!";
client.sendMessage(msg);
}
}
参考文献:http://blog.csdn.net/qq_23473123/article/details/51464272
http://blog.csdn.net/ns_code/article/details/14128987
相关文章推荐
- Java Socket 编程实例学习
- Linux网络编程基础之二--UDP --Unix学习总结之四
- Exchange编程学习实例1--定期删除管理员邮件 vbs
- Java socket 入门编程实例
- javascript DOM编程实例(智播客学习)
- Java Socket套接字应用实例-java学习笔记(1)
- java socket点对点以及点对面编程实例
- Bash编程实例学习总结
- UNIX环境高级编程学习之第十三章守护进程 - 单实例的守护进程
- 实例学习Dreamweaver MX ASP编程基础2
- Java socket 入门编程实例
- C# .net2.0 套接字编程实例 UDP TCP通信
- Java UDP 网络编程 示例 -Java学习笔记(30)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之二--Linux中断的组织形式
- UDP编程实例
- 传智播客学习之DOM编程实例
- Exchange编程学习实例2--移动邮件到公用文件夹 vbs
- Java socket 入门编程实例-Java基础-Java-编程开发
- windows socket编程实例-UDP(2007-07-22 14:05)
- 基于UDP协议的socket编程实例