這幾天學了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(); } } }