瘋狂java講義第6版
⑴ 瘋狂java講義:使用MulticastSocket實現多點廣播(4)
該類主要實現底層的網路通信功能 在該類中提供了一個broadCast方法 該方法使用MulticastSocket將指定字元串廣播到所有客戶端 還提供了sendSingle方法 該方法使用DatagramSocket將指定字元串發送到指定SocketAddress 如程序中前兩行粗體字代碼所示 除此之外 該類里還提供了 個內部線程類 ReadSingle和ReadBroad 這兩個線程類採用循環不斷讀取DatagramSocket和MulticastSocket中的數據 如果讀到的信息是廣播來的在線信息 則保持該用戶在線 如果讀到的是用戶的聊天信息 則直接將該信息顯示出來
在該類中用到了本程序的一個主類 LanChat 該類使用DefaultListModel來維護用戶列表 該類里的每個列表項就是一個UserInfo 該類還提供了一個ImageCellRenderer 該類用於將列表項繪制出用戶圖標和用戶名字
程序清單 codes/ / /LanChat/LanChat java
public class LanChat extends JFrame
{
private DefaultListModel listModel = new DefaultListModel()
//定義一個JList對象
private JList friendsList = new JList(listModel)
//定義一個用於格式化日期的格式器
private DateFormat formatter = DateFormat getDateTimeInstance()
public LanChat()
{
super( 區域網聊天 )
//設置該JList使用ImageCellRenderer作為單元格繪制器
friendsList setCellRenderer(new ImageCellRenderer())
listModel addElement(new UserInfo( all 所有人 null ))
friendsList addMouseListener(new ChangeMusicListener())
add(new JScrollPane(friendsList))
setDefaultCloseOperation(JFrame EXIT_ON_CLOSE)
setBounds( )
}
//向用戶列表中添加用戶
public void addUser(UserInfo user)
{
listModel addElement(user)
}
//從用戶列表中刪除用戶
public void removeUser(int pos)
{
listModel removeElementAt(pos)
}
//根據地址來查詢用戶
public UserInfo getUserBySocketAddress(SocketAddress address)
{
for (int i = ; i < getUserNum() ; i++)
{
UserInfo user = getUser(i)
if (user getAddress() != null &&
user getAddress() equals(address))
{
return user;
}
}
return null;
}
// 下面兩個方法是對ListModel的包裝
//獲取該聊天窗口的用戶數量
public int getUserNum()
{
return listModel size()
}
//獲取指定位置的用戶
public UserInfo getUser(int pos)
{
return (UserInfo)listModel elementAt(pos)
}
//實現JList上的滑鼠雙擊監聽器
class ChangeMusicListener extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
//如果滑鼠的擊鍵次數大於
if (e getClickCount() >= )
{
//取出滑鼠雙擊時選中的列表項
UserInfo user = (UserInfo)friendsList getSelectedValue()
//如果該列表項對應用戶的交談窗口為null
if (user getChatFrame() == null)
{
//為該用戶創建一個交談窗口 並讓該用戶引用該窗口
user setChatFrame(new ChatFrame(null user))
}
//如果該用戶的窗口沒有顯示 則讓該用戶的窗口顯示出來
if (!user getChatFrame() isShowing())
{
user getChatFrame() setVisible(true)
}
}
}
}
/**
* 處理網路數據報 該方法將根據聊天信息得到聊天者
* 並將信息顯示在聊天對話框中
* @param packet 需要處理的數據報
* @param single 該信息是否為私聊信息
*/
public void processMsg(DatagramPacket packet boolean single)
{
//獲取該發送該數據報的SocketAddress
InetSocketAddress srcAddress = (InetSocketAddress)packet getSocket
Address()
//如果是私聊信息 則該Packet獲取的是DatagramSocket的地址 將埠減 才是
//對應的MulticastSocket的地址
if (single)
{
srcAddress = new InetSocketAddress(srcAddress getHostName()
srcAddress getPort() )
}
UserInfo srcUser = getUserBySocketAddress(srcAddress)
if (srcUser != null)
{
//確定消息將要顯示到哪個用戶對應窗口上
UserInfo alertUser = single ? srcUser : getUser( )
//如果該用戶對應的窗口為空 顯示該窗口
if (alertUser getChatFrame() == null)
{
alertUser setChatFrame(new ChatFrame(null alertUser))
}
//定義添加的提示信息
String tipMsg = single ? 對您說 : 對大家說 ;
//顯示提示信息
alertUser getChatFrame() addString(srcUser getName() + tipMsg
+ ……( + formatter format(new Date()) + )
+ new String(packet getData() packet getLength()) + )
if (!alertUser getChatFrame() isShowing())
{
alertUser getChatFrame() setVisible(true)
}
}
}
//主方法 程序的入口
public static void main(String[] args)
{
LanChat lc = new LanChat()
new LoginFrame(lc 請輸入用戶名 頭像後登錄 )
}
}
//定義用於改變JList列表項外觀的類
class ImageCellRenderer extends JPanel implements ListCellRenderer
{
private ImageIcon icon;
private String name;
//定義繪制單元格時的背景色
private Color background;
//定義繪制單元格時的前景色
private Color foreground;
public Component getListCellRendererComponent(JList list Object value int
index boolean isSelected boolean cellHasFocus)
{
UserInfo userInfo = (UserInfo)value;
icon = new ImageIcon( ico/ + userInfo getIcon() + gif )
name = userInfo getName()
background = isSelected ? list getSelectionBackground() : list getBack
ground()
foreground = isSelected ? list getSelectionForeground() : list
getForeground()
//返回該JPanel對象作為單元格繪制器
return this;
}
//重寫paintComponent方法 改變JPanel的外觀
public void paintComponent(Graphics g)
{
int imageWidth = icon getImage() getWidth(null)
int imageHeight = icon getImage() getHeight(null)
g setColor(background)
g fillRect( getWidth() getHeight())
g setColor(foreground)
//繪制好友圖標
g drawImage(icon getImage() getWidth() / imageWidth / null)
g setFont(new Font( SansSerif Font BOLD ))
//繪制好友用戶名
g drawString(name getWidth() / name length() * imageHeight + )
}
//通過該方法來設置該ImageCellRenderer的最佳大小
public Dimension getPreferredSize()
{
return new Dimension( )
}
}
上面類中提供的addUser和removeUser方法用於暴露給通信類ComUtil使用 用於向用戶列表中添加 刪除用戶 除此之外 該類還提供了一個processMsg方法 該方法用於處理網路中讀取的數據報 將數據報中的內容取出 並顯示在特定的窗口中
上面講解的只是本程序的關鍵類 本程序還涉及YeekuProtocol ChatFrame LoginFrame等類 由於篇幅關系 此處不再給出這些類的源代碼 讀者可以參考codes/ / /LanTalk路徑下的源代碼
返回目錄 瘋狂Java講義
編輯推薦
Java程序性能優化 讓你的Java程序更快 更穩定
新手學Java 編程
lishixin/Article/program/Java/hx/201311/27255
⑵ 推薦幾本安卓開發的書籍,我學過一點點java,也算有點java基礎的
最好的java學習,最全的java學習
《瘋狂Java講義》---本書並不是一本簡單的Java入門教材,也不是一門「閉門造車」式的Java讀物。本書來自於筆者6年多的Java培訓經歷,凝結了筆者近6000個小時的授課經驗,總結了上千個Java學員學習過程中的典型錯誤。
《瘋狂Android講義》---本書全面地介紹了Android應用開發的相關知識。
《輕量級Java EE企業應用實戰--Struts 2+Spring+Hibernate整合開發》---本書是《輕量級Java EE企業應用實戰》的第3版,第3版保持了第2版內容全面、深入的特點,主要完成全部知識的升級。
《 瘋狂Java 突破程序員基本功16課》、《瘋狂XML講義》、《瘋狂Ajax講義Prototype/jQuery+DWR+Spring+Hibernate整合開發》、《Struts 2.1權威指南--基於WebWork核心的MVC開發》、《經典Java EE企業應用實戰》
《瘋狂HTML 5/CSS 3/JavaScript講義》 --- 本書是一本全面介紹HTML5、CSS 3和JavaScript前端開發技術的圖書,本書系統地介紹了HTML 5常用的元素和屬性,HTML 5的表單元素和屬性,HTML 5的繪圖支持,HTML 5的多媒體支持,CSS 3的功能和用法、包括最前沿的變形與動畫功能等。配合『瘋狂java』官網上的視頻學習。「李剛老師視頻」、「肖文吉老師視頻」「李韓飛老師視頻」
⑶ 關於java的入門類書籍
樓上說的太有才了,這么多書我保證他自己都沒有全看過。書三本,先看李剛的瘋狂java講義,再看瘋狂java輕量級框架,再看經典框架,或者孫玉琴的java系列都可以。關鍵是第一本,是java的基礎。視頻呢,就看馬士兵的全套,或者張孝祥的就可以了。樓上說的三本書都是在新華書店上找的。《Java大學簡明教程――實常式序設計》這本書如果新手看了,我保證新手如天書般,甚至失去對java的興趣~~
對了還有,你自己去淘寶買完北大青鳥的accp系列書,並且認真看完,並且所有的例子都自己一個一個敲過,那麼也可以算是java入門了~~
⑷ 零基礎的人學java,看哪些書。。求推薦幾本書籍
《瘋狂java講義》 對於這本書,相信大家不陌生,《瘋狂講義》這本書深入介紹了java編程的相關方面,這本書的內容有Java基本語法結構、面向對象特徵、集合框架體系、 泛型、異常處理、GUI編程、JDBC資料庫編程、注釋、的IO流體系、多線程編程、網路通信編程、反射機制和java開發中需要的jar包、類和介面。