Udp发送端的步骤:
1, 创建发送端
DatagramSocket ds=new DatagramSocket();
2, 创建发送端数据包
String str=”我的发送端的数据”
Byte[] buf=str.getBytes();
DatagramPacket dp=new DatagramPacket(buf,0,buf.length,InetAddress.getByName(“localhost”),8888);
3, 发送数据
Ds.send(dp);
4, 关闭发送端
Ds.close();
Udp接收端的步骤:
1, 创建接收端
DatagramSocket ds=new DatagramSocket(8888);
2, 创建接收端数据包
Byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
3, 接收数据
Ds.receive(dp);
4, 处理接收到的数据(解析)
String ip=dp.getAddress().getHostAddress();
Int port=dp.getPort();
String str=new String(dp.getData(),0,dp.getLength());
5, 关闭接收端
Ds.close();
发送端:
package cn.itheima.cway.chatrom;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 发送端
*
* @author 超哥
*
*/
class Send implements Runnable {
private DatagramSocket ds=null;
public Send(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
//接收一个键盘输入
BufferedReader sen = new BufferedReader(new InputStreamReader(
System.in));
//定义一个接收键盘输入的字符串暂存
String buf=null;
try {
while ((buf = sen.readLine()) != null) {
// 键盘输入转换为byte数组
byte[] buff=buf.getBytes();
//创建一个发送数据包
DatagramPacket dp = new DatagramPacket(buff,buff.length, InetAddress.getByName("192.168.0.255"),10001);
//发送数据
ds.send(dp);
//如果数据包含over则退出
if(buff.equals("over"))
break;
//ds.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接收端:
package cn.itheima.cway.chatrom;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 接收端
* @author 超哥
*
*/
class Rece implements Runnable{
private DatagramSocket ds=null;
public Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run() {
while(true)
{
//创建一个结束数据的字节数组缓存
byte[] buf=new byte[1024];
//创建接收数据包对象
DatagramPacket dp=new DatagramPacket(buf,buf.length);
try {
//接收数据
ds.receive(dp);
//获取数据中的ip地址
String ip=dp.getAddress().getHostAddress();
//接收数据中的端口号
int port=dp.getPort();
//接收数据内容
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"-"+port+":\t"+text);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
主程序:
package cn.itheima.cway.chatrom;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ChatRom {
/**
* 聊天室 需求:使用UDP协议完成一个简单的聊天室功能,如果用户输入over则退出
* @throws SocketException
*
*/
public static void main(String[] args) throws SocketException {
new Thread(new Send(new DatagramSocket())).start();
new Thread(new Rece(new DatagramSocket(10001))).start();
}
}
DatagramSocket:
构造方法摘要 | |
---|---|
| DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。 |
protected | DatagramSocket(DatagramSocketImpl impl) 创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。 |
| DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。 |
| DatagramSocket(int port,InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。 |
| DatagramSocket(SocketAddress bindaddr) 创建数据报套接字,将其绑定到指定的本地套接字地址。 |
提供的常用方法:
void | receive(DatagramPacket p) 从此套接字接收数据报包。 |
void | send(DatagramPacket p) 从此套接字发送数据报包。 |
DatagramPacket:
构造方法摘要 | |
---|---|
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket ,用来接收长度为 length 的数据包。 | |
DatagramPacket(byte[] buf, int length,InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 | |
DatagramPacket(byte[] buf, int offset, int length) 构造 DatagramPacket ,用来接收长度为 length 的包,在缓冲区中指定了偏移量。 | |
DatagramPacket(byte[] buf, int offset, int length,InetAddress address, int port) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 | |
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 | |
DatagramPacket(byte[] buf, int length,SocketAddress address) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 |
常用方法:
InetAddress | getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 |
byte[] | getData() 返回数据缓冲区。 |
int | getLength() 返回将要发送或接收到的数据的长度。 |
int | getOffset() 返回将要发送或接收到的数据的偏移量。 |
int | getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 |
SocketAddress | getSocketAddress() 获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。 |