Java TCP/IP Socket 编程 笔记(三)—UDP的例子
2013-01-05 21:03
816 查看
/article/4059124.html
Java TCP/IP Socket 编程 笔记(三)—UDP的例子
博客分类:
J2SE
编程JavaSocket.net
1.UDP套接字与TCP套接字不同。UDP套接字在使用前不需要进行连接。TCP协议与电话通信相似,而UDP协议则与邮件通信相似:你寄包裹或信件时不要进行“连接”,但是你的为每个包裹和信件制定目的地址。类似地,每条信息(datagram,即数据报文)负载了自己的地址信息,并与其他信息相互独立。在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建,UDP套接字就可以用来连续地向不同的地址发送消息,或从任何地址接收信息。
UDP套接字将保留边界信息。UDP不像TCP一样,它是尽可能地传送消息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部分寄信一样)。因此,UDP套接字的程序必须准备好处理信息的丢失和重排。
UDP的优点之一是效率较高,其次是灵活性。
Java通过DatagramPacket类和DatagramSocket类来使用UDP套接字。客户端和服务端都使用DatagramSocket来发送数据,使用DatagramPacket来接收数据。
发送信息时,Java程序创建一个包含了待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket类的send()方法。接收信息时,Java程序首先创建一个DatagramPacket类的实例,该实例中预先分配了一些空间(一个字节数组byte[]),并将接收到的信息存放在该空间中。然后把该实例作为参数传递给DatagramSocket类的receive()方法。
DatagramPacket的内部有length和offset字段,如果指定了offset,数据报文的数据部分将从字节数组的指定位置发送或接收数据。length参数指定了字节数组中在发送时要传输的字节数,活在接收数据时所能接收的最多字节数。length要比data.length小,但不能比它大。
UDP客户端:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/5f9874338769eb98bd58fb85fc7d4901.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/fedab3f8fdaba692508a4c44d9984d4f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/199f625995018946f4dae8f8c017c133.gif)
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPEchoClientTimeout {
private static
final int TIMEOUT=3000;
private static
final int MAXTRIES=5;
public static
void main(String[] args) throws IOException {
if(args.length<2||args.length>3){
throw new IllegalArgumentException("Parameter(s):<Server> <Word> [<Port>]");
}
InetAddress serverAddress=InetAddress.getByName(args[0]);//server address;
byte [] bytesToSend=args[1].getBytes();
int servPort=(args.length==3)?Integer.parseInt(args[2]):7;
//1.创建一个DatagramSocket实例,可以选择对本地地址和端口进行设置。
DatagramSocket socket=new DatagramSocket();
//设置receive()方法的最长阻塞时间
socket.setSoTimeout(TIMEOUT);
DatagramPacket sendPacket=new DatagramPacket(bytesToSend,bytesToSend.length,serverAddress,servPort);
DatagramPacket receivePacket=new DatagramPacket(new
byte[bytesToSend.length],bytesToSend.length);
int tries=0;
boolean receivedResponse=false;
do{
//2.使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例,进行通信
socket.send(sendPacket);
try{
socket.receive(receivePacket);
if(!receivePacket.getAddress().equals(serverAddress)){
throw new IOException("Received packet from an unknown source");
}
receivedResponse=true;
}catch(InterruptedIOException e){
tries+=1;
System.out.println("Timed out,"+(MAXTRIES-tries)+" more tries ...");
}
}while(!receivedResponse&&(tries<MAXTRIES));
if(receivedResponse){
System.out.println("Received: "+new String(receivePacket.getData()));
}else{
System.out.println("No response -- giving up.");
}
//3.通信完成后,使用DatagramSocket类的close方法来销毁该套接字
socket.close();
}
}
UDP的服务器端:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/5f9874338769eb98bd58fb85fc7d4901.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/fedab3f8fdaba692508a4c44d9984d4f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/199f625995018946f4dae8f8c017c133.gif)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPEchoServer {
private static
final int ECHOMAX=255;//max size of echo datagram
public static
void main(String[] args) throws IOException {
if(args.length!=1){
throw new IllegalArgumentException("Parameter(s):<Port>");
}
int servPort=Integer.parseInt(args[0]);
//1.创建一个DatagramSocket实例,指定本地端口号,可以选择指定本地地址
DatagramSocket socket=new DatagramSocket(servPort);
DatagramPacket packet=new DatagramPacket(new
byte[ECHOMAX],ECHOMAX);
while(true){
//2.使用DatagramSocket的receive方法来接收一个DatagramPacket实例。
socket.receive(packet);
System.out.println("Handling client at "+packet.getAddress().getHostAddress()+" on port "+packet.getPort());
socket.send(packet);
packet.setLength(ECHOMAX);
}
}
}
注意:DatagramPacket的getData()方法的使用,它返回数据缓冲区,是一个字节数组,需要注意。
packet.setData(buf, offset,length);设置了接收数据时放到缓存去buf中的位置
,因此接收的数据new String(packet.getData(),packet.getOffset(),packet.getLength())的方式构造的。
Java TCP/IP Socket 编程 笔记(三)—UDP的例子
博客分类:
J2SE
编程JavaSocket.net
1.UDP套接字与TCP套接字不同。UDP套接字在使用前不需要进行连接。TCP协议与电话通信相似,而UDP协议则与邮件通信相似:你寄包裹或信件时不要进行“连接”,但是你的为每个包裹和信件制定目的地址。类似地,每条信息(datagram,即数据报文)负载了自己的地址信息,并与其他信息相互独立。在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建,UDP套接字就可以用来连续地向不同的地址发送消息,或从任何地址接收信息。
UDP套接字将保留边界信息。UDP不像TCP一样,它是尽可能地传送消息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部分寄信一样)。因此,UDP套接字的程序必须准备好处理信息的丢失和重排。
UDP的优点之一是效率较高,其次是灵活性。
Java通过DatagramPacket类和DatagramSocket类来使用UDP套接字。客户端和服务端都使用DatagramSocket来发送数据,使用DatagramPacket来接收数据。
发送信息时,Java程序创建一个包含了待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket类的send()方法。接收信息时,Java程序首先创建一个DatagramPacket类的实例,该实例中预先分配了一些空间(一个字节数组byte[]),并将接收到的信息存放在该空间中。然后把该实例作为参数传递给DatagramSocket类的receive()方法。
DatagramPacket的内部有length和offset字段,如果指定了offset,数据报文的数据部分将从字节数组的指定位置发送或接收数据。length参数指定了字节数组中在发送时要传输的字节数,活在接收数据时所能接收的最多字节数。length要比data.length小,但不能比它大。
UDP客户端:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/5f9874338769eb98bd58fb85fc7d4901.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/fedab3f8fdaba692508a4c44d9984d4f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/199f625995018946f4dae8f8c017c133.gif)
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPEchoClientTimeout {
private static
final int TIMEOUT=3000;
private static
final int MAXTRIES=5;
public static
void main(String[] args) throws IOException {
if(args.length<2||args.length>3){
throw new IllegalArgumentException("Parameter(s):<Server> <Word> [<Port>]");
}
InetAddress serverAddress=InetAddress.getByName(args[0]);//server address;
byte [] bytesToSend=args[1].getBytes();
int servPort=(args.length==3)?Integer.parseInt(args[2]):7;
//1.创建一个DatagramSocket实例,可以选择对本地地址和端口进行设置。
DatagramSocket socket=new DatagramSocket();
//设置receive()方法的最长阻塞时间
socket.setSoTimeout(TIMEOUT);
DatagramPacket sendPacket=new DatagramPacket(bytesToSend,bytesToSend.length,serverAddress,servPort);
DatagramPacket receivePacket=new DatagramPacket(new
byte[bytesToSend.length],bytesToSend.length);
int tries=0;
boolean receivedResponse=false;
do{
//2.使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例,进行通信
socket.send(sendPacket);
try{
socket.receive(receivePacket);
if(!receivePacket.getAddress().equals(serverAddress)){
throw new IOException("Received packet from an unknown source");
}
receivedResponse=true;
}catch(InterruptedIOException e){
tries+=1;
System.out.println("Timed out,"+(MAXTRIES-tries)+" more tries ...");
}
}while(!receivedResponse&&(tries<MAXTRIES));
if(receivedResponse){
System.out.println("Received: "+new String(receivePacket.getData()));
}else{
System.out.println("No response -- giving up.");
}
//3.通信完成后,使用DatagramSocket类的close方法来销毁该套接字
socket.close();
}
}
import java.io.IOException; import java.io.InterruptedIOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPEchoClientTimeout { private static final int TIMEOUT=3000; private static final int MAXTRIES=5; public static void main(String[] args) throws IOException { if(args.length<2||args.length>3){ throw new IllegalArgumentException("Parameter(s):<Server> <Word> [<Port>]"); } InetAddress serverAddress=InetAddress.getByName(args[0]);//server address; byte [] bytesToSend=args[1].getBytes(); int servPort=(args.length==3)?Integer.parseInt(args[2]):7; //1.创建一个DatagramSocket实例,可以选择对本地地址和端口进行设置。 DatagramSocket socket=new DatagramSocket(); //设置receive()方法的最长阻塞时间 socket.setSoTimeout(TIMEOUT); DatagramPacket sendPacket=new DatagramPacket(bytesToSend,bytesToSend.length,serverAddress,servPort); DatagramPacket receivePacket=new DatagramPacket(new byte[bytesToSend.length],bytesToSend.length); int tries=0; boolean receivedResponse=false; do{ //2.使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例,进行通信 socket.send(sendPacket); try{ socket.receive(receivePacket); if(!receivePacket.getAddress().equals(serverAddress)){ throw new IOException("Received packet from an unknown source"); } receivedResponse=true; }catch(InterruptedIOException e){ tries+=1; System.out.println("Timed out,"+(MAXTRIES-tries)+" more tries ..."); } }while(!receivedResponse&&(tries<MAXTRIES)); if(receivedResponse){ System.out.println("Received: "+new String(receivePacket.getData())); }else{ System.out.println("No response -- giving up."); } //3.通信完成后,使用DatagramSocket类的close方法来销毁该套接字 socket.close(); } }
UDP的服务器端:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/5f9874338769eb98bd58fb85fc7d4901.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/fedab3f8fdaba692508a4c44d9984d4f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201301/199f625995018946f4dae8f8c017c133.gif)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPEchoServer {
private static
final int ECHOMAX=255;//max size of echo datagram
public static
void main(String[] args) throws IOException {
if(args.length!=1){
throw new IllegalArgumentException("Parameter(s):<Port>");
}
int servPort=Integer.parseInt(args[0]);
//1.创建一个DatagramSocket实例,指定本地端口号,可以选择指定本地地址
DatagramSocket socket=new DatagramSocket(servPort);
DatagramPacket packet=new DatagramPacket(new
byte[ECHOMAX],ECHOMAX);
while(true){
//2.使用DatagramSocket的receive方法来接收一个DatagramPacket实例。
socket.receive(packet);
System.out.println("Handling client at "+packet.getAddress().getHostAddress()+" on port "+packet.getPort());
socket.send(packet);
packet.setLength(ECHOMAX);
}
}
}
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPEchoServer { private static final int ECHOMAX=255;//max size of echo datagram public static void main(String[] args) throws IOException { if(args.length!=1){ throw new IllegalArgumentException("Parameter(s):<Port>"); } int servPort=Integer.parseInt(args[0]); //1.创建一个DatagramSocket实例,指定本地端口号,可以选择指定本地地址 DatagramSocket socket=new DatagramSocket(servPort); DatagramPacket packet=new DatagramPacket(new byte[ECHOMAX],ECHOMAX); while(true){ //2.使用DatagramSocket的receive方法来接收一个DatagramPacket实例。 socket.receive(packet); System.out.println("Handling client at "+packet.getAddress().getHostAddress()+" on port "+packet.getPort()); socket.send(packet); packet.setLength(ECHOMAX); } } }
注意:DatagramPacket的getData()方法的使用,它返回数据缓冲区,是一个字节数组,需要注意。
packet.setData(buf, offset,length);设置了接收数据时放到缓存去buf中的位置
,因此接收的数据new String(packet.getData(),packet.getOffset(),packet.getLength())的方式构造的。
相关文章推荐
- Java TCP/IP Socket 编程 笔记—TCP的例子
- 初识Java TCP/IP Socket-UDP网络编程知识
- Java TCP/IP Socket 编程 笔记
- 19. JAVA 网络编程 Part 1 (IP与InetAddress类、URL与URLConnection类、URLEncoder与URLDecoder类、TCP&UDP)---- 学习笔记
- Java TCP/IP Socket 编程学习笔记系列 +数据结构
- Java TCP/UDP socket 编程流程总结
- Windows下C语言的Socket编程例子(TCP和UDP)
- C语言的Socket编程例子(TCP和UDP)
- Java网络编程,Socket,ServerSocket使用,TCP,UDP的异同
- Windows下C语言的Socket编程例子(TCP和UDP)
- 【Java TCP/IP Socket】Socket编程大合集
- java TcpSocket编程小例子
- Windows下C语言的Socket编程例子(TCP和UDP)
- iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP
- Java网络编程基础(二)-- 基于TCP/IP的Socket编程
- Java TCPIP 编程 那些事 ServerSocket (二)
- [2014-11-21]Java笔记_Java网络编程、TCP、UDP
- 黑马程序员——JAVA基础---网路编程---概述,UDP/TCP对应Socket,小知识点
- android 网络编程--socket tcp/ip udp http之间的关系
- Java基础 网络编程 Socket UDP TCP URL