先说一下关于InetAddress类,用一个小例子:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IPDemo {
public static void main(String[] args) throws UnknownHostException {
// InetAddress i = InetAddress.getLocalHost();获取本地信息
// System.out.println(i);
InetAddress i = InetAddress.getByName("www.baidu.com");
System.out.println(i.getHostAddress());
System.out.println(i.getHostName());
}
}
UDP是一种面向无连接的传输方式,传输速度快,但是每次传输的大小不能超过64K
怎样来编写UDP?
发送数据步骤:
1.创建socket服务
2.创建数据包
3.将数据封装到数据包中,添加ip和端口以及数据
4.发送
5.关闭资源
接收数据步骤:
1.创建socket服务,并监听端口
2.创建数据包,用来接收数据
3.用socket接收数据到数据包中
4.从数据包中取出数据
5.关闭资源
下面用代码演示:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
class UdpSend{
//1.创建socket服务
//2.传输数据,并打包
//3.发送
//4.关闭资源
public static void main(String[] args) throws Exception {
//1.创建socket服务
DatagramSocket socket = new DatagramSocket(10000);//指定发送器端口
//2.传输数据,并打包
byte[] buf = "udp hello".getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length,
InetAddress.getByName("localhost"), 8888);//指定应用程序端口
//发送
socket.send(packet);
//关闭资源
socket.close();
System.out.println("over");
}
}
/*
* 1.创建服务socket,并监听端口
* 2.定义一个数据包,用来接受数据包
* 3.用socket服务接受的数据保存到,数据包中
* 4.取出数据
* 5.关闭资源
*/
class UdpRece{
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8888);//指定应用程序的端口
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+data);
ds.close();
}
}
public class UdpDemo {
public static void main(String[] args) {
}
}
上面传送一次数据,下面写一个增强版的。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
class Send{
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line =null;
while((line = reader.readLine())!=null){
if("886".equals(line)){
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),8888);
socket.send(dp);
}
reader.close();
socket.close();
}
}
class Rece{
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
while(true){
byte[] buf = new byte[1024];
DatagramPacket dp =new DatagramPacket(buf, buf.length);
socket.receive(dp);
String data = new String(dp.getData(),0,dp.getLength());
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
System.out.println(ip+":"+port+":"+data);
}
}
}
public class UdpDemo2 {
public static void main(String[] args) {
}
}
总结:其实java中将网络传输的部件,都封装成对象,非常方便使用,在网络编程中主要是记住步骤。