本文目錄一覽:
- 1、瘋狂Java講義:使用ServletSocket創建TCP伺服器端
- 2、求推薦JAVA入門書籍
- 3、瘋狂Java講義:使用MulticastSocket實現多點廣播(4)
- 4、瘋狂java講義學完什麼水平
瘋狂Java講義:使用ServletSocket創建TCP伺服器端
使用ServletSocket創建TCP伺服器端
從圖 中看上去TCP通信的兩個通信實體之間並沒有伺服器端 客戶端之分 但那是兩個通信實體已經建立虛擬鏈路之後的示意圖 在兩個通信實體沒有建立虛擬鏈路之前 必須有一個通信實體先做出 主動姿態 主動接收來自其他通信實體的連接請求
Java中能接受其他通信實體連接請求的類是ServerSocket ServerSocket對象用於監聽來自客戶端的Socket連接 如果沒有連接 它將一直處於等待狀態 ServerSocket包含一個監聽來自客戶端連接請求的方法
Socket accept() 如果接收到一個客戶端Socket的連接請求 該方法將返回一個與客戶端Socket對應的Socket(如圖 所示每個TCP連接有兩個Socket) 否則該方法將一直處於等待狀態 線程也被阻塞
為了創建ServerSocket對象 ServerSocket類提供了如下幾個構造器
ServerSocket(int port) 用指定的埠port來創建一個ServerSocket 該埠應該是有一個有效的埠整數值 ~
ServerSocket(int port int backlog) 增加一個用來改變連接隊列長度的參數backlog
ServerSocket(int port int backlog InetAddress localAddr) 在機器存在多個 IP地址的情況下 允許通過localAddr這個參數來指定將ServerSocket綁定到指定的IP地址
當ServerSocket使用完畢 應使用ServerSocket的close()方法來關閉該ServerSocket 通常情況下 伺服器不應該只接受一個客戶端請求 而應該不斷地接受來自客戶端的所有請求 所以Java程序通常會通過循環 不斷地調用ServerSocket的accept()方法 如下代碼片段所示
//創建一個ServerSocket 用於監聽客戶端Socket的連接請求
ServerSocket ss = new ServerSocket( )
//採用循環不斷接受來自客戶端的請求
while (true)
{
//每當接受到客戶端Socket的請求 伺服器端也對應產生一個Socket
Socket s = ss accept()
//下面就可以使用Socket進行通信了
…
}
上面程序中創建ServerSocket沒有指定IP地址 則該ServerSocket將會綁定到本機默認的IP地址 程序中使用 作為該ServerSocket的埠號 通常推薦使用 以上的埠 主要是為了避免與其他應用程序的通用埠衝突
返回目錄 瘋狂Java講義
編輯推薦
Java程序性能優化 讓你的Java程序更快 更穩定
新手學Java 編程
lishixinzhi/Article/program/Java/hx/201311/27266
求推薦JAVA入門書籍
1,《Head First Java》java入門書籍
《Head First Java》是本完整的面向對象(object-oriented,OO)程序設計和Java的學習指導。此書是根據學習理論所設計的,讓你可以從學習程序語言的基礎開始一直到包括線程、網路與分散式程序等項目。最重要的,你會學會如何像個面向對象開發者一樣去思考。
《HeadFirstJava(中文版)(第2版)(涵蓋Java5.0)》的圖文並茂學習方式能讓你快速地在腦海中掌握住知識。敞開心胸準備好學習這些關鍵性的主題:Java程序語言;面向對象程序開發;Swing圖形化介面;使用JavaAPI函數庫;編寫、測試與部署應用程序;處理異常;多線程;網路程序設計;集合與泛型。
如果你想要看”一本正經”的書,去找其他的。如果你真地想要好好地學習Java,你會需要《Head First Java》。這本書可是Amazon編輯推薦的十大好書之一!強烈推薦學習此書,非常適合初學者入門。
2《Java從入門到精通》適合自學者
《Java從入門到精通》這本書主要針對java基礎,對於沒有學過java的人才說,是一個不錯的選擇。通過這本書,大家可以從零開始,慢慢來學習,而且實操很多,不會讓你看到最後出現只會理論的情況。為什麼說培訓的人不用看呢?因為這本書上的內容和許多培訓機構的書籍有很多重複的地方,所以參加培訓的同學就可以不看了。如果覺得自學太難太慢的話,那就報培訓機構吧.
3.《Thinking in java》(中文名:《Java編程思想》)適合中級自學者和培訓者
《Java編程思想》可以說是最經典的java著作,是所有java程序員必備教科書。這本書不管是正在學習還是已經工作許多年的程序員,都可以從這本書中得到你想要的東西。這本書具有教材和工具書的作用,就像一本字典,想知道什麼都可以從中查詢。雖然這本書很好,但並不建議初學者學習,對於初學者難度較大。
4.《瘋狂Java講義》適合自學者看
《瘋狂的講義》這本書比較適合自學者,內容比較項目化,實操方法很多,如果你想進行java的深入學習,不妨看看這本書。
《瘋狂Java講義(第5版)》深入介紹了Java編程的相關方面,全書內容覆蓋了Java的基本語法結構、Java的面向對象特徵、Java集合框架體系、Java泛型、異常處理、Java GUI編程、JDBC資料庫編程、Java注釋、Java的IO流體系、Java多線程編程、Java網路通信編程和Java反射機制。覆蓋了java.lang、java.util、java.text、和java.nio、java.sql、java.awt、javax.swing包下絕大部分類和介面。本書重點介紹了Java的模塊化系統,還詳細介紹了Java 10、Java 11的使用var聲明局部變數、在Lambda表達式中使用var聲明變數、改進的javac命令、基於嵌套的訪問控制、HTTP Client網路編程,以及Java 10、Java 11新增的各種API功能。
5.《Java核心技術》最適合報培訓班的看
這本書分為兩個部分,第一個部分講的是基礎知識,第二個部分講的是高級特性。由於內容非常有層次,所以非常適合自學和上培訓機構的同學學習。尤其對參加培訓的同學作用較大,因為一般培訓機構講的非常快,有很多東西沒辦法及時消化吸收,很多基礎和核心的東西就會掌握的不牢固,那麼這本書正好彌補了這個缺失。
6.《Java開發實戰經典》適合自學者看
該書是一本綜合講解Java核心技術的書籍,在書中使用大量的代碼及案例進行知識點的分析與運用,並且給出一些比較成熟的開發步驟,幫助讀者更好地進行Java的開發。
從作者多年的Java培訓經驗來看,大部分學生對各種高端開發都沒有任何問題,唯一的問題在於Java基礎並不牢固,而且在國內也始終沒有一本真正可以引領讀者入門的好書籍,大部分的書籍都是圍繞概念本身進行講解的,沒有講解清楚為什麼要具備這些知識以及該如何去理解這些知識。本書真正地做到了讓每一位讀者都能清楚地知道每個知識點的來龍去脈,不僅可以很容易地看懂一個程序,而且能真正地靈活運用程序,編寫代碼。
在學習編程語言時,環境、代碼調試等,都是很多讀者最頭疼的地方,而且很多代碼都會存在一些細節上的問題,所以,本書為了讓讀者可以更好地理解每一個知識點,將書中所有內容都錄製成了視頻,讓每一位讀者真正做到”輕鬆學Java、從零開始學Java”,以優質的視頻教學為每一位讀者提供最大的支持。
這本書比較適合自學者學習,裡面有很多小案例,可以邊學邊練,鞏固知識。
瘋狂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()) + )\n
+ new String(packet getData() packet getLength()) + \n )
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 編程
lishixinzhi/Article/program/Java/hx/201311/27255
瘋狂java講義學完什麼水平
瘋狂java講義學完中等水平。瘋狂java講義是國人原創必讀經典了,同樣非常適合初學者。講解內容細緻全面,系統通俗,目錄劃分和查找非常方便,就算完全沒有基礎也可以學的沒有什麼壓力,學完可以升級一個水平,達到中等水平。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/219683.html