亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java中UDP簡單聊天程序實例代碼

2019-11-26 15:49:17
字體:
來源:轉載
供稿:網友

學過計算機網絡通信的都知道,計算機之間傳送數據由兩種,即TCP通信和UDP通信。TCP是可靠的面向連接的通信協議,二UDP是不可靠的面向無連接的通信協議。

java中有基于TCP的網絡套接字通信,也有基于UDP的用戶數據報通信,UDP的信息傳輸速度快,但不可靠!

基于UDP通信的基本模式:

(1)將數據打包,稱為數據包(好比將信件裝入信封一樣),然后將數據包發往目的地。

(2)接受別人發來的數據包(好比接收信封一樣),然后查看數據包中的內容。

客戶機

復制代碼 代碼如下:

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);
  }

 }
}

復制代碼 代碼如下:

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();
    }
}

服務器:

復制代碼 代碼如下:

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);
  }

 }
}

復制代碼 代碼如下:

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();
    }
}

運行截圖:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费在线观看| 91干在线观看| 亚洲在线免费看| 久久久久久午夜| 国产日韩精品在线播放| 日韩免费在线免费观看| 91沈先生在线观看| 91老司机在线| 国产激情久久久久| 亚洲欧美一区二区三区四区| 欧美在线观看网址综合| 精品国产91久久久久久老师| 国产精品视频自拍| 国产精品wwww| 欧美精品成人91久久久久久久| 国产欧美婷婷中文| 日本不卡免费高清视频| 久久精品99久久香蕉国产色戒| 久久夜精品va视频免费观看| 国产视频福利一区| 亚洲奶大毛多的老太婆| 亚洲人成五月天| 在线播放日韩av| 国产精品尤物福利片在线观看| 欧美极品在线视频| 欧美理论电影网| 日本欧美爱爱爱| 亚洲精品一区二区在线| 欧美影院成年免费版| 91精品国产综合久久久久久蜜臀| 欧美日韩成人在线播放| 91精品美女在线| 日韩在线视频网站| 国产97在线|日韩| 国产不卡精品视男人的天堂| www.欧美精品一二三区| 亚洲一级一级97网| 国产成人精彩在线视频九色| 欧洲日本亚洲国产区| 九九热99久久久国产盗摄| 成人免费看吃奶视频网站| 国产精品久久久久久亚洲影视| 一区二区av在线| 日韩精品极品在线观看播放免费视频| 伊人青青综合网站| 成人综合网网址| 91亚洲精华国产精华| 亚洲一区二区三区久久| 日韩av一区二区在线观看| 国产精品日韩欧美| 国产午夜精品免费一区二区三区| 日韩在线视频导航| 亚洲人成网在线播放| 亚洲欧洲在线观看| 国产精品福利观看| 亚洲精品电影网在线观看| 欧洲中文字幕国产精品| 日韩在线免费av| 欧美性少妇18aaaa视频| 亚州欧美日韩中文视频| 91免费的视频在线播放| 一区二区国产精品视频| 国产欧美一区二区白浆黑人| 97久久伊人激情网| 91精品国产91久久久久久| 亚洲免费伊人电影在线观看av| 亚洲人午夜色婷婷| 国产日韩欧美在线看| 亚洲免费高清视频| 久久五月情影视| 一区二区三区精品99久久| 国产精品久久久久久久久久久久| 92看片淫黄大片看国产片| 日韩欧美在线看| 在线观看久久久久久| 精品福利免费观看| 91视频8mav| 亚洲精品suv精品一区二区| 91影院在线免费观看视频| 日韩在线观看av| 4438全国成人免费| 久久人人爽人人爽爽久久| 最近中文字幕2019免费| 国产精品精品一区二区三区午夜版| 成人网在线免费观看| 亚洲第一男人天堂| 日韩av在线免播放器| 日韩欧美在线观看| 国产成人综合久久| 国产一区二区视频在线观看| 亚洲欧洲在线免费| 欧美片一区二区三区| 欧美日韩美女在线观看| 久久久免费电影| 2025国产精品视频| 亚洲国产精品成人精品| 成人激情视频在线观看| 欧美丝袜一区二区| 色综合久久久888| 亚洲缚视频在线观看| 另类视频在线观看| 日韩视频在线一区| 乱亲女秽乱长久久久| 欧美乱妇高清无乱码| 久久免费成人精品视频| 亚洲成人三级在线| 久久久久久综合网天天| 亚洲国产美女精品久久久久∴| 亚洲欧美另类在线观看| 久久免费少妇高潮久久精品99| 成人伊人精品色xxxx视频| 精品久久久久久久久久| 久久精品99久久久久久久久| 国产成人精品久久亚洲高清不卡| 2018日韩中文字幕| 久久影院免费观看| 精品成人久久av| 欧美猛男性生活免费| 亚洲成avwww人| 色综合久久88色综合天天看泰| 色在人av网站天堂精品| 国产一区二区日韩精品欧美精品| 久久视频中文字幕| 日韩在线欧美在线国产在线| 国产91网红主播在线观看| 亚洲大尺度美女在线| 国产91热爆ts人妖在线| 欧美最近摘花xxxx摘花| 国产91亚洲精品| 国产视频精品xxxx| 久久精品中文字幕一区| 91精品久久久久久久久久入口| 色哟哟网站入口亚洲精品| 国产精品爽黄69天堂a| 在线视频亚洲欧美| 亚洲国产成人91精品| 最近中文字幕日韩精品| 亚洲xxxx视频| 国产一区玩具在线观看| 亚洲电影在线看| 亚洲视频在线观看网站| 在线精品高清中文字幕| 91丨九色丨国产在线| 色偷偷88888欧美精品久久久| 91国产一区在线| 欧美wwwxxxx| 欧美成人精品一区二区三区| 亚洲影影院av| 日韩高清中文字幕| 51视频国产精品一区二区| 亚洲第一网中文字幕| 色婷婷综合久久久久中文字幕1| 欧美一区二区三区精品电影| 国产欧美精品久久久| 欧美成人精品在线播放| 欧美日韩综合视频网址| 麻豆乱码国产一区二区三区| 亚洲精品久久久久久久久久久久久| 色偷偷91综合久久噜噜| 91在线无精精品一区二区| 中文字幕在线观看日韩| 国产亚洲欧美日韩精品| 国产美女91呻吟求| 国产欧美日韩最新|