您的位置:首页 > 理论基础 > 计算机网络

java网络编程基础:UDP

2015-08-01 20:49 453 查看
目录
1、网络知识基础
2、UDP传输
3、利用UDP模仿聊天室

 

1、网络知识基础

1.1网络通讯要素

IP地址 标识设备,本地默认IP:127.0.0.1,主机名:localhost
端口号 标识进程,有效端口号:0-65535,其中0-1024系统保留
传输协议 通讯规则,TCP,UDP等

1.2InetAddress类
  表示互联网协议 (IP) 地址,常用方法:

getLocalHost() 返回本地主机
getByName(String str) 根据给定主机名(IP地址字符串)获得IP地址
getHostName()  返回此IP地址的主机名
getHostAddress() 返回IP地址字符串

1.3域名解析
  DNS,DomainNameSystem域名系统,将我们访问网站时输入的域名(例如www.oracle.com)解析为ip.电脑里本地的DNS解析文件位于C:\Windows\System32\drivers\etc目录下的HOSTS文件,可以对其修改,添加自定义域名解析表,实现屏蔽广告页面等功能(将广告页面的网址对应127.0.0.1)

1.4URL类

URL是统一资源定位符,示例代码

public
4000
class URLDemo {

public static void main(String[] args) throws IOException {

URL url = new URL("http://192.168.1.100:8080/myweb/index.html?name=zhangsan");

System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getFile());
System.out.println(url.getPath());
System.out.println(url.getQuery());

}
} 

1.5Socket简介

  网络通信的端点,通信的两端都有Socket,网络通信其实就是Socket之间的通信,数据在两个Socket间通过IO传输

 

2、UDP传输

2.1UDP特点

    User Datagram Protocol 用户数据报协议
    无连接,不可靠的协议
    将数据封装成数据包,每个大小限制在64K内,速度快

2.2相关类
    DatagramSocket
      Socket服务类,主要方法:send(),receive()等,receive方法为阻塞方法
    DatagramPacket
      数据报包类,用于封装和解析数据
  注意
    发送端和接收端是两个独立运行的程序,接收端必须明确端口号

2.3例代码

// 发送端
public class Sender {

public static void main(String[] args) throws IOException {

// 1:使用DatagramSocket对象,简历UDP的Socket服务
DatagramSocket socket = new DatagramSocket();

// 2:使用DatagramPacket对象,将要发送的数据封装在数据报包中
String str = "Hello World";
byte[] buf = str.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 10000);

// 3:通过Socket服务,调用send()方法将数据报包发送出去
socket.send(packet);

// 4:关闭Socket服务
socket.close();
}
}

// 接收端
public class Receiver {

public static void main(String[] args) throws IOException {

// 1:使用DatagramSocket对象,简历UDP的Socket服务
DatagramSocket socket = new DatagramSocket(10000);

// 2:使用DatagramPacket对象,用于接收数据报包数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);

// 3:通过Socket的receive()方法将接受的数据存储在数据报包中
socket.receive(packet);

// 4:通过数据报包对象的方法解析数据包中的数据(地址,端口,数据内容等)
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println(ip + ":" + port + ":" + str);

// 5:关闭Socket服务
socket.close();
}
}

 

 3、利用UDP模仿聊天室

  将上述代码进行改进,增加多线程和发广播的功能,可以实现简易的聊天室:

//发送端任务类
public class Send implements Runnable {

private DatagramSocket socket;

public Send(DatagramSocket socket) {
this.socket = socket;
}

@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String words = null;
try {
while ((words = reader.readLine()) != null) {
byte[] buf = words.getBytes();
// 255表示发广播
DatagramPacket packet = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.1.255"), 10000);
socket.send(packet);
// 模拟结束
if ("886".equals(words)) {
break;
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}

//接收端任务类
public class Receive implements Runnable {

private DatagramSocket socket;

public Receive(DatagramSocket socket) {
this.socket = socket;
}

@Override
public void run() {
try {
while (true) {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

String ip = packet.getAddress().getHostAddress();
String message = new String(packet.getData(), 0,
packet.getLength());
System.out.println(ip + ":" + message);

}
} catch (IOException e) {
e.printStackTrace();
}
}

}

//开启聊天
public class Chart {

public static void main(String[] args) throws SocketException {
DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(10000);
new Thread(new Send(send)).start();
new Thread(new Receive(receive)).start();
}

}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: