设为首页 - 加入收藏 焦点技术网
热搜:java
当前位置:首页 >

JAVA学习第六十课 — UDP协议 &基于多线程模拟简单的QQ聊天程序

2014-11-01 16:17:00.0 JAVA学习  
导读:UDP传输UDP有发送端和接受端,有两大类,DatagramSocket、DatagramPacket建立发送端和接收端建立数据包调用Socket的接收发送方法关闭Socket注意:发送端和接收端是两个独立的运行程序UDP发送端演示DatagramPacket(byte[] buf, int length,InetAddress address, int port)构造数据报包,用来将长度为 le...。。。

UDP传输

UDP有发送端和接受端,有两大类,DatagramSocket、DatagramPacket

建立发送端和接收端

建立数据包

调用Socket的接收发送方法

关闭Socket

注意:发送端和接收端是两个独立的运行程序

UDP发送端演示

DatagramPacket(byte[] buf, int length,InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

public static void UDPsendDemo() throws IOException {  System.out.println("发送端");  /*   * 创建UDP传输的发送端:   * 1.建立UDP的Socket服务   * 2.将要发送的数据封装到数据包中   * 3.用UDP的Socket服务将数据包发送出去   * 4.关闭Socket服务   */  //建立UDP的Socket服务,使用DatagramSocket对象  DatagramSocket ds = new DatagramSocket();  //不指定端口号,发送端,就是随机的    //数据封装成包  String str = "udp发送";    //使用DatagramPacket将数据封装到该对象的包中  byte[] by = str.getBytes();  DatagramPacket dp = new DatagramPacket(by,by.length,InetAddress.getByName("127.0.0.1"),6534);    //通过UDP的Socket服务将数据包发送出去,send方法  ds.send(dp);  ds.close(); }


UDP接收端演示

 public static void UDPreceiveDemo() throws IOException {  //接受端  System.out.println("接收端");  /*   * 创建UDP传输的接收端:   * 1.建立UDP的Socket服务,因为要接收数据,必须要明确端口号   * 2.创建数据包,用于存储接收到的数据,以便于用数据包的方法解析这些数据   * 3.使用Socket服务的receive方法接收的数据存储到数据包中   * 4.通过数据包中的方法解析包中数据   * 5.关闭   */  //建立UDP的Socket服务,使用DatagramSocket对象  DatagramSocket ds = new DatagramSocket(6534);//接收端口6534    //创建数据包  byte[] buf = new byte[1024];  DatagramPacket dp = new DatagramPacket(buf, buf.length);    //使用接收方法将数据存储到数据包  ds.receive(dp);//注意该方法是阻塞式的    //使用数据包对象的方法,解析其中的数据,如:地址、端口、内容  String ip = dp.getAddress().getHostAddress();//获取ip地址字符串    int port = dp.getPort();//获取端口    String datatext = new String(dp.getData(),0,dp.getLength());//将数据封装成字符串对象    System.out.println("ip:"+ip+"port : "+port+"data:"+datatext);    //关闭  ds.close(); }

基于多线程模拟简单的QQ聊天程序

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;class Receive implements Runnable{ private DatagramSocket ds;  public Receive(DatagramSocket ds){  this.ds = ds; } public void run() {  try {   while(true){    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 datatext = new String(dp.getData(),0,dp.getLength());    if(datatext.equals("over")){     System.out.println("ip:"+ip+"port : "+port+"退出聊天室");    }    else{     System.out.println("ip:"+ip+"port : "+port+"data:"+datatext);    }           }  } catch (Exception e) {   // TODO: handle exception  } }}class Send implements Runnable{ private DatagramSocket ds; public Send(DatagramSocket ds){  this.ds = ds; } public void run() {  try {   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String line = null;   while((line = br.readLine())!=null){        byte[] buf = line.getBytes();    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.255"),6534);    //IP的有效位是0-254,255是广播,也就是127.0.0,这一IP字段上所有存活的电脑都可以接收到我发的信息    ds.send(dp);    if("over".equals(line))break;   }   ds.close();  } catch (Exception e) {   // TODO: handle exception  } }}public class Main { public static void main(String[] args) throws IOException{    DatagramSocket dsend =new DatagramSocket();  DatagramSocket dr =new DatagramSocket(6534);  Send send = new Send(dsend);  Receive receive = new Receive(dr);  Thread t1 = new Thread(send);  Thread t2 = new Thread(receive);  t1.start(); t2.start();  }}



(编辑: u013497151)

网友评论
相关文章