1. 程式人生 > >JAVA中TCP,UDP傳輸 簡單的聊天室程式

JAVA中TCP,UDP傳輸 簡單的聊天室程式

JAVA中聊天室程式

要求: 編寫一個聊天程式 有收資料的部分,也同時有發資料的部分。 這兩部分需要同時執行,那就需要用到多執行緒技術。 一個執行緒控制發,一個執行緒控制收。

注意

這裡我們需要注意的是,因為收發動作是不一致的,所以要定義兩個run方法,而且這兩個方法要封裝到不同的類中。並且,我們在寫出我們的地址時,如果是一對一我們可以寫出目的的IP地址即可,也可以寫成255形式,如目標地址是10.34.0.114,這時雙方兩人進行聊天,也可以是10.34.0.255,廣播的方式讓在這個頻段的主機都可以收到訊息。

程式碼

import java.io.*;
import java.net.*;
/*
 因為收和發動作是不一致的,所以要定義兩個run方法。
 而且這兩個方法要封裝到不同的類中。
 */
class Send implements Runnable{ private DatagramSocket ds;//私有化成員 public Send(DatagramSocket ds){ this.ds=ds; } public void run(){//重寫run方法 try{//傳送端,讀鍵盤,封裝在一個單獨執行緒當中 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));//轉化流 String line=null; while((line=bufr.
readLine())!=null){ if("886".equals(line)) break; byte[] buf=line.getBytes();//建立緩衝區 DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("10.32.0.255"),10006);//傳送到哪去,獲取主機的資訊 ds.send(dp);//將包投遞出去 } } catch(Exception e){ throw new RuntimeException
("傳送失敗"); } } } class Rece implements Runnable{ private DatagramSocket ds; public Rece(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();//獲取傳送端主機地址和主機資訊 String data=new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+data);// } } catch(Exception e){ throw new RuntimeException("接收端失敗"); } } } /* 主函式 */ class liaotian1{ public static void main(String args[])throws Exception{ DatagramSocket sendSocket=new DatagramSocket();//傳送端服務 DatagramSocket receSocket=new DatagramSocket(10006);//接收端服務 new Thread(new Send(sendSocket)).start();//建立thread類 開啟多執行緒 new Thread(new Rece(receSocket)).start();// } }

結果

很尷尬,我沒有結果。由於本人的膝上型電腦的限制,在經歷了一次重灌後,本人沒有安裝VM虛擬機器,所以現在不能演示。 本次程式碼的條件是需要兩臺或者兩臺以上在一個區域網中的電腦才可以進行聊天室的功能 具體的操作是,在DOS命令列上進行JAVAC 後JAVA liaotian1即可,等候其他人的加入進行聊天。 注意,在這裡不再一個區域網中,即使是找到了目標的IP地址,連結了internet也是無法進行聊天,本人親測 才疏學淺,大部分程式碼還是在看畢向東老師的視訊中學習,還請各位大神多多指點。如有結果圖,還請給我一張~~