程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 基於UDP協議的控制台聊天,UDP協議控制台聊天

基於UDP協議的控制台聊天,UDP協議控制台聊天

編輯:JAVA綜合教程

基於UDP協議的控制台聊天,UDP協議控制台聊天


這幾天學了java的網絡編程弄出一個基於UDP協議的聊天工具

功能

添加並且備注好友(輸入對方的ip)

刪除好友

查看好友列表

用java寫的控制台程序導出可執行程序後不能雙擊打開 還需要些一個腳本文件(前提是電腦需裝有jre運行環境) java -jar %1 pause   然後保存bat文件  將jar文件用這個bat文件打開就可以了     源碼: package udp;   import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.Timer; import java.util.TimerTask;   public class UDPspend {       static DatagramPacket packet = null;// 用於發送數據的包     static DatagramSocket socket = null;// 用於發送數據     static DatagramPacket packet1 = null;// 用於接收數據的包     static DatagramSocket socket1 = null;// 用於接收數據     static final int port = 8087;     static byte[] info1 = new byte[2048];// 接收的數據放到此數組內     static String duiFangIpString = null;// 與之對話的ip地址     static List<String> list = new ArrayList<String>();// 用於保存好友的ip信息     static List<String> listName = new ArrayList<String>();// 用於保存好友的姓名     static int dangQian = 0;     static int count = 0;       public static void send(String ip, String info) throws Exception     {         byte message[] = info.getBytes();// 將要發送的內容放到字節數組中         InetAddress addr = InetAddress.getByName(ip);//由於datagramPacket()構造器中智只能傳入InetAddress類型的所以~         packet = new DatagramPacket(message, message.length, addr, port);//將數據封包         socket = new DatagramSocket();//創建一個對象用來發送包         socket.send(packet);//發送包         // System.out.println("已發送");     }       public static void receive() throws Exception     {         socket1 = new DatagramSocket(port);//監視這個port端口         packet1 = new DatagramPacket(info1, info1.length);//將接收的內容存入info1字節數組中         class jieShou extends TimerTask//創建一個定時的任務,每隔一段時間內就掃描一下這個端口有沒有發來的信息         {             public void run()             {                 try                 {                     socket1.receive(packet1);//接收數據包                     String message = null;                     message = new String(info1, 0, packet1.getLength());//將字節轉換為字符串                       String name = packet1.getAddress().toString().replaceAll("/", "");//得到發送對象的地址                      // System.out.println(name);                     int i = list.indexOf(name);//在好友列表內尋找有沒有這個地址                     if (i == -1)//沒有找到                     {                         name = "陌生人";                     } else                     {                         name = listName.get(i);//找到了  並得到此好友ip地址的備注                     }                     System.out.println(name + " :  " + message);                     packet1.setLength(info1.length);//重設接收包的長度,即接收的內容只能是此字節數組的長度大於此長度的內容 會自動捨棄  ,最大為64K                 } catch (Exception e)                 {                     e.printStackTrace();                 }             }         }         jieShou jieShou = new jieShou();         Timer timer = new Timer();         timer.schedule(jieShou, 100, 1000);//從程序運行後100毫秒啟動任務  並每隔1000毫秒執行一次此任務     }       public static void listFriends()//顯示好友信息     {         if (count == 0)             System.out.println("你目前沒有好友");         for (int i = 0; i < count; i++)         {             System.out.println(i + 1 + "     " + listName.get(i) + "     " + list.get(i));         }     }       public static void addFriend()//添加好友     {         Scanner sc = new Scanner(System.in);//不能讀入空格         BufferedReader sc1=new BufferedReader(new InputStreamReader(System.in));//可以讀入空格         System.out.println("請輸入姓名");         String nameString=null;         try         {               nameString =sc1.readLine();//輸入姓名         } catch (Exception e)         {             System.out.println("輸入姓名發生錯誤");         }         System.out.println("請輸入ip");         String ipString = sc.next();         //用正則表達式來驗證輸入的ip地址是否合法         if (!ipString                 .matches("(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)"))             System.out.println("ip格式錯誤");         else if (list.indexOf(ipString)<count&&list.indexOf(ipString)>=0)         {             System.out.println("此好友已經存在");         } else         {             try             {                 InetAddress address = InetAddress.getByName(ipString);                 list.add(address.toString().replaceAll("/", ""));                 listName.add(nameString);                 count++;//添加好友到列表                 addHaoYou(nameString, ipString,true);//將好友信息保存到文件中             } catch (Exception e)             {                 // TODO: handle exception                 System.out.println("添加好友失敗");             }             System.out.println("添加好友成功");         }     }       public static void delete()//刪除好友     {         for(int i=dangQian;i<count-1;i++)         {             list.set(i, list.get(i+1));             listName.set(i, listName.get(i+1));         }         count--;//刪除一位好友         addHaoYou("", "",false);//清空文件保存的好友信息         for(int i=0;i<count;i++)//將所有的好友信息重新寫入文件             addHaoYou(listName.get(i),list.get(i),true);         System.out.println("刪除成功");     }       public static void huiHua()//會話     {         if (count == 0)         {             System.out.println("你目前沒有好友,請添加好友");             addFriend();           } else         {             listFriends();             System.out.println("請選擇你的好友 編號");             Scanner sc = new Scanner(System.in);             int op = 0;             String n = null;             while (op == 0)             {                 n = sc.next();                 if (n.matches("\\d*") && Integer.valueOf(n) > 0 && Integer.valueOf(n) <= count)//輸入的數據不合法                     op = 1;                 else                 {                     System.out.println("沒有這個編號,請重新輸入");                     op = 0;                 }             }             BufferedReader sc1=new BufferedReader(new InputStreamReader(System.in));             dangQian = Integer.valueOf(n)-1;             System.out.println("開始會話,輸入00000退出會話");             String info;             try             {                 while (true)                 {                     info = sc1.readLine();                       if (info.equals("00000"))                         break;                     else if (info.equals("@add@"))                     {                         addFriend();                         break;                     } else if (info.equals("@list@"))                     {                         listFriends();                         // break;                     } else if(info.equals("@delete@"))                     {                         delete();                         break;                     }                     else                      {                         duiFangIpString = list.get(Integer.valueOf(n) - 1).toString();                         send(duiFangIpString, info);                     }                 }               } catch (Exception e)             {                 System.out.println("會話錯誤");             }           }     }       public static void duQuHaoYou()//從文件中讀取好友的信息     {         try         {             File file = new File("haoyou");             BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));             String temp = null;             String[] name = new String[2];             while ((temp = in.readLine()) != null)             {                 // System.out.println(11);                 name = temp.split("#");//以#為分隔符  前面是姓名 後面是ip                 listName.add(name[0]);                 list.add(name[1]);                 count++;             }         } catch (Exception e)         {               System.out.println("讀取好友信息失敗");         }     }       public static void addHaoYou(String name, String ip,boolean b)//當b為真時 以追加的方式寫入文件   當b為假時  清空原來的文件內容然後重新寫入     {         try         {               FileWriter out = new FileWriter("haoyou",b);             if(b==false)                 out.write("");             else              out.write(name + "#" + ip+"\r\n");//在windows操作系統下  回車+換行才是一個真正的換行             out.flush();//這裡一定要刷新  否則不會寫到文件中  數據還保存在緩沖區中  除非緩沖區滿了           } catch (Exception e)         {             // TODO: handle exception         }     }       public static void main(String[] args) throws Exception     {         InetAddress address=InetAddress.getLocalHost();         System.out.println("本機地址: "+address.getHostAddress());         System.out.println("使用須知    在會話界面輸入 \n@list@  顯示好友信息\n@add@  添加好友\n@delete@  刪除好友\n00000  退出會話 ");         duQuHaoYou();         receive();         while (true)         {             huiHua();         }     } }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved