源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

java中UDP简单聊天程序实例代码

  • 时间:2020-09-07 22:43 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:java中UDP简单聊天程序实例代码
学过计算机网络通信的都知道,计算机之间传送数据由两种,即TCP通信和UDP通信。TCP是可靠的面向连接的通信协议,二UDP是不可靠的面向无连接的通信协议。 java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠! 基于UDP通信的基本模式: (1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。 (2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。 客户机
[u]复制代码[/u] 代码如下:
package com.client.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ObjectOutputStream; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import com.tools.ClientToServerThread; /**  * @author lenovo  *  */ public class JChatFrm extends JFrame implements ActionListener{  JTextArea jta;  JTextField jtf;  JButton jb;  JPanel jp;  String ownerId;  String friendId;  ClientToServerThread ctsT;  public static void main(String[] args) {   // TODO Auto-generated method stub   new JChatFrm();  }  public JChatFrm()  {   setTitle("客户端");   jta=new JTextArea();   jtf=new JTextField(15);   jb=new JButton("发送");   jb.addActionListener(this);   jp=new JPanel();   jp.add(jtf);   jp.add(jb);   this.add(jta,"Center");   this.add(jp,"South");  // this.setTitle(ownerId+" 正在和 "+friend+" 聊天");   this.setIconImage((new ImageIcon("image/qq.gif").getImage()));  // this.setSize(300, 200);   this.setBounds(300, 200, 300, 200);   this.setVisible(true);   setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   ctsT = new ClientToServerThread(jta);   ctsT.start();   /**窗体关闭按钮事件*/   this.addWindowListener(new WindowAdapter()   {    public void windowClosing(WindowEvent e)    {     if(JOptionPane.showConfirmDialog(null, "<html><font size=3>确定退出吗?</html>","系统提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)==0)     {        System.exit(0);      ctsT.closeSocket();     }     else     {      return;     }    }   }   );  }  //写一个方法,让它显示消息  public void showMessage(String message)  {   String info= message;   this.jta.append(info);  }  public void actionPerformed(ActionEvent arg0) {   // TODO Auto-generated method stub   if(arg0.getSource()==jb)   {       byte buffer[] = jtf.getText().trim().getBytes();    ctsT.sendData(buffer);   }  } }
[u]复制代码[/u] 代码如下:
package com.tools; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.util.Properties; import javax.swing.JTextArea; import com.common.User; /**  * @author lenovo  *  */ public class ClientToServerThread extends Thread{  private String serverIP = "127.0.0.1";  private int serverPORT = 8888;  private int receivePORT = 6666;  //声明发送信息的数据报套结字     private DatagramSocket sendSocket = null;     //声明发送信息的数据包     private DatagramPacket sendPacket = null;     //声明接受信息的数据报套结字     private DatagramSocket receiveSocket = null;     //声明接受信息的数据报     private DatagramPacket receivePacket = null;     //收发数据的端口     private int myPort = 0;     //接收数据主机的IP地址     private String friendIP = null;     private int friendPort = 0;     //缓冲数组的大小     public static final int BUFFER_SIZE = 5120;     private byte inBuf[] = null; //接收数据的缓冲数组     private byte outBuf[] = null; //发送数据的缓冲数组     JTextArea jta;  // 构造函数  public ClientToServerThread(JTextArea jta) {   this.jta = jta;   getPropertiesInfo();  }  public void run() {   String receiveInfo = "";   try{    inBuf = new byte[BUFFER_SIZE];    receivePacket = new DatagramPacket(inBuf,inBuf.length);    receiveSocket = new DatagramSocket(receivePORT);   }catch (Exception e) {    e.printStackTrace();    // TODO: handle exception   }   while (true) {    if(receiveSocket == null){     break;    } else {     try {      receiveSocket.receive(receivePacket);      String message = new String(receivePacket.getData(),0,receivePacket.getLength());      jta.append("收到数据"+message+"n");     } catch (Exception e) {      e.printStackTrace();      // TODO: handle exception     }    }   }  }  /**   * 该方法用来获得服务器属性文件中的IP、PORT   */  private void getPropertiesInfo(){   Properties prop = new Properties();   InputStream inStream = Thread.currentThread().getContextClassLoader()     .getResourceAsStream("ServerInfo.properties");   try{    //获得相应的键值对    prop.load(inStream);   }catch(IOException e){    e.printStackTrace();   }   //根据相应的键获得对应的值   serverIP = prop.getProperty("serverip");   serverPORT = Integer.parseInt(prop.getProperty("serverudp.port"));   receivePORT = Integer.parseInt(prop.getProperty("receiveudp.port"));          }  public void sendData(byte buffer[]){   try{    InetAddress address = InetAddress.getByName(serverIP);   // outBuf = new byte[BUFFER_SIZE];    sendPacket = new DatagramPacket(buffer,buffer.length,address,serverPORT);    sendSocket = new DatagramSocket();    sendSocket.send(sendPacket);   }catch (Exception e) {    e.printStackTrace();    // TODO: handle exception   }  }     public void closeSocket(){      receiveSocket.close();     } }
服务器:
[u]复制代码[/u] 代码如下:
package com.server.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ObjectOutputStream; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import com.tools.ClientToServerThread; /**  * @author lenovo  *  */ public class JChatFrm extends JFrame implements ActionListener{  JTextArea jta;  JTextField jtf;  JButton jb;  JPanel jp;  String ownerId;  String friendId;  ClientToServerThread ctsT;  public static void main(String[] args) {   // TODO Auto-generated method stub   new JChatFrm();  }  public JChatFrm()  {   setTitle("服务器");   jta=new JTextArea();   jtf=new JTextField(15);   jb=new JButton("发送");   jb.addActionListener(this);   jp=new JPanel();   jp.add(jtf);   jp.add(jb);   this.add(jta,"Center");   this.add(jp,"South");  // this.setTitle(ownerId+" 正在和 "+friend+" 聊天");   this.setIconImage((new ImageIcon("image/qq.gif").getImage()));  // this.setSize(300, 200);   this.setBounds(300, 200, 300, 200);   this.setVisible(true);   setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   ctsT = new ClientToServerThread(jta);   ctsT.start();   /**窗体关闭按钮事件*/   this.addWindowListener(new WindowAdapter()   {    public void windowClosing(WindowEvent e)    {     if(JOptionPane.showConfirmDialog(null, "<html><font size=3>确定退出吗?</html>","系统提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)==0)     {        System.exit(0);      ctsT.closeSocket();     }     else     {      return;     }    }   }   );  }  //写一个方法,让它显示消息  public void showMessage(String message)  {   String info= message;   this.jta.append(info);  }  public void actionPerformed(ActionEvent arg0) {   // TODO Auto-generated method stub   if(arg0.getSource()==jb)   {          byte buffer[] = jtf.getText().trim().getBytes();    ctsT.sendData(buffer);   }  } }
[u]复制代码[/u] 代码如下:
package com.tools; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.util.Properties; import javax.swing.JTextArea; import com.common.User; /**  * @author lenovo  *  */ public class ClientToServerThread extends Thread{  private String sendIP = "127.0.0.1";   private int sendPORT = 6666;  private int receivePORT = 8888;  //声明发送信息的数据报套结字     private DatagramSocket sendSocket = null;     //声明发送信息的数据包     private DatagramPacket sendPacket = null;     //声明接受信息的数据报套结字     private DatagramSocket receiveSocket = null;     //声明接受信息的数据报     private DatagramPacket receivePacket = null;     //收发数据的端口     private int myPort = 0;     //接收数据主机的IP地址     private String friendIP = null;     private int friendPort = 0;     //缓冲数组的大小     public static final int BUFFER_SIZE = 5120;     private byte inBuf[] = null; //接收数据的缓冲数组     private byte outBuf[] = null; //发送数据的缓冲数组     JTextArea jta;  // 构造函数  public ClientToServerThread(JTextArea jta) {   this.jta = jta;   getPropertiesInfo();  }  public void run() {   String receiveInfo = "";   try{    inBuf = new byte[BUFFER_SIZE];    receivePacket = new DatagramPacket(inBuf,inBuf.length);    receiveSocket = new DatagramSocket(receivePORT);   }catch (Exception e) {    e.printStackTrace();    // TODO: handle exception   }   while (true) {    if(receiveSocket == null){     break;    } else {     try {      receiveSocket.receive(receivePacket);      String message = new String(receivePacket.getData(),0,receivePacket.getLength());      jta.append("收到数据"+message+"n");     } catch (Exception e) {      e.printStackTrace();      // TODO: handle exception     }    }   }  }  /**   * 该方法用来获得服务器属性文件中的IP、PORT   */  private void getPropertiesInfo(){   Properties prop = new Properties();   InputStream inStream = Thread.currentThread().getContextClassLoader()     .getResourceAsStream("ServerInfo.properties");   try{    //获得相应的键值对    prop.load(inStream);   }catch(IOException e){    e.printStackTrace();   }   //根据相应的键获得对应的值   receivePORT = Integer.parseInt(prop.getProperty("serverudp.port"));     }  public void sendData(byte buffer[]){   try{    InetAddress address = InetAddress.getByName(sendIP);   // outBuf = new byte[BUFFER_SIZE];    sendPacket = new DatagramPacket(buffer,buffer.length,address,sendPORT);    sendSocket = new DatagramSocket();    sendSocket.send(sendPacket);   }catch (Exception e) {    e.printStackTrace();    // TODO: handle exception   }  }  public void closeSocket(){      receiveSocket.close();     } }
运行截图: [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100103_0_2619.jpg[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部