您的位置:首页 > 编程语言 > Java开发

JAVA学习之基于UDP的通信

2017-03-22 20:39 162 查看
UDP是不需要连接的通信协议,需要两个端:发送端和接收端。UDP通信可以使用DatagramSocket的send和receive方法。下面通过代码实现UDP发送端和接收端互通。

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;
import java.net.UnknownHostException;

public class ChatTest {
public static void main(String[] args) throws SocketException {
/* 通过UDP协议完成一个聊天程序
* 一个负责发送。一个负责接收。同时进行,多线程
* */
DatagramSocket send=new DatagramSocket();//DatagramSocket 表示是用来发送和接收数据报包的套接字。
DatagramSocket rece=new DatagramSocket(10062);
new Thread(new Send(send)).start();
new Thread(new Receive(rece)).start();
}
}
class Receive implements Runnable{
private DatagramSocket ds;
public Receive(DatagramSocket ds) {
super();
this.ds = ds;
}

public void run(){
while(true){
//创建接收的数据包
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);//DatagramPacket表示数据报包。数据报包用来实现无连接包投递服务。
//接收
try {
ds.receive(dp);
System.out.println("接收了");
} catch (IOException e) {
e.printStackTrace();
}
//获取数据
String ip=dp.getAddress().getHostAddress();//getHostAddress():返回 IP 地址字符串(以文本表现形式)。
String data = new String(dp.getData(),0,dp.getLength());
if("over".equals(data)){
System.out.println("离开聊天室");
}
System.out.println(ip+":"+data);
}
}
}
class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds) {
super();
this.ds = ds;
}
public void run(){
System.out.println("发送端启动");
//键盘录入
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));//?
//读取数据
String line = null;
try {
while((line=buffer.readLine())!=null){
//将数据变成字节数组,封装到数据包中
//将录入的数据封装到数据包中
byte[] buf = line.getBytes();
DatagramPacket dp=new
DatagramPacket(buf,buf.length,InetAddress.getByName("10.104.4.196"),10062);
ds.send(dp);
System.out.println("发送结束");
if("over".equals(line)){
break;
}
}
ds.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: