[零散篇]Java學習筆記—Java的Socket網路編程以及多線程

來源:互聯網
上載者:User

1.Socket是代表兩台機器之間網路連接的對象(java.net.Socket)。

   Socket的建立如下,參數分別是伺服器端的IP地址和連接埠號碼: Socket socket  =  new Socket("167.5.75.1",5000);

2.    用戶端(Client)Socket的使用 

 2.1 Socket讀出資料步驟

// 1.建立Socket串連,告知Server的IP地址以及連接埠號碼Socket socket = new Socket("127.0.0.1", 4242);// 2.建立InputStreamReader,用於讀取socket輸入資料流InputStreamReader stream = new InputStreamReader(socket.getInputStream());// 3.使用BufferedReader連結輸入資料流BufferedReader br = new BufferedReader(stream);// 4.讀出資料String line = null;while ((line = br.readLine()) != null){System.out.println("Today's advice is: " + line);}// 5. 關閉輸入資料流BufferedReaderbr.close();

  2.2 Scoket寫入資料步驟: 

// 1.建立Socket串連,告知Server的IP地址以及連接埠號碼Socket socket = new Socket("127.0.0.1", 4242);// 2.建立PrintWriter對象,用以接收socket輸出資料流PrintWriter writer = new PrintWriter(socket.getOutputStream());// 3.使用PrintWriter對象寫出輸出資料String advice ="Today's advice";writer.println(advice);// 4. 關閉串連writer.close();

3.  伺服器端(Server)Socket的使用 

// 1.建立一個SercerSocket,使用4242連接埠監聽用戶端請求ServerSocket serverSocket = new ServerSocket(4242);System.out.println("The server is started, listening on port 4242");while (true){// 2.ServerSocket的accept()在等待使用者串連的時候閑置;在使用者串連上來的時候,返回一個Socket來與用戶端通訊Socket socket = serverSocket.accept();// 3.建立PrintWriter對象,用以接收socket輸出資料流PrintWriter writer = new PrintWriter(socket.getOutputStream());// 4.使用PrintWriter對象寫出輸出資料String advice = "notifier's blog";writer.println(advice);// 5. 關閉串連writer.close();}

4.   線程的狀態

       線程總共有5種狀態:

  1. 建立 (Thread t = new Thread())

  2. 就緒 (t.start())

  3. 運行

  4. 堵塞

    線程被block的原因很多,比如: 等待IO操作, sleep(), 等待被佔用對象釋放

     5. 死亡

5.    解決線程同步化問題的方法是: 對使用到共用對象的方法使用synchronized

   需要注意的是:

       雖說是方法進行了synchronized,但鎖不是加在方法上的而是對象上的,也就是說,是synchronized方法擷取對象鎖。如果對象(類)有兩個或者多個synchronized方法,就表示兩個線程不能同時進入同一個方法,也不能同時進入不同的方法。 因為同一時間,只有一個方法在佔有對象鎖。

6.    synchronized代碼塊

       有時候在一個方法中做了很多事情,但只有一部分邏輯是需要synchronized的,這時候我們可以使用synchronized代碼塊。如下,其中this表示當前對象: 

public void function(){doSomething();//以下方法需要同步化synchronized (this){doCriticalStuff();moreCriticalStuff();}doSomeOtherThing();}

7. 以下是一個Socket簡單的例子:

用戶端代碼及詳細注釋:

/** * @author notifier * @create 2010-9-25 上午10:12:10 * @version 1.0 */public class DailyAdviceClient{public static void main(String[] args){DailyAdviceClient client = new DailyAdviceClient();client.receiveMsg();}public void receiveMsg(){try{// 1.建立Socket串連,告知Server的IP地址以及連接埠號碼Socket socket = new Socket("127.0.0.1", 4242);// 2.建立InputStreamReader,用於讀取socket輸入資料流InputStreamReader stream = new InputStreamReader(socket.getInputStream());// 3.使用BufferedReader連結輸入資料流BufferedReader br = new BufferedReader(stream);// 4.讀出資料String line = null;while ((line = br.readLine()) != null){System.out.println("Today's advice is: " + line);}// 5. 關閉輸入資料流BufferedReaderbr.close();} catch (UnknownHostException e){e.printStackTrace();} catch (IOException e){e.printStackTrace();}}}

伺服器端代碼及詳細注釋:

/** * @author notifier * @create 2010-9-25 下午07:06:54 * @version 1.0 */public class SimpleChatServer{// 儲存用戶端列表private ArrayList clientList = new ArrayList();;public static void main(String[] args){new SimpleChatServer().startUp();}/** * 負責伺服器端的啟動 * */public void startUp(){try{// 建立伺服器端ServerSocket串連,監聽連接埠號碼5000ServerSocket serverSocket = new ServerSocket(5000);// 輪詢等待用戶端請求while(true){// 等待用戶端請求,無請求則閑置;有請求到來時,返回一個對該請求的socket串連Socket clientSocket = serverSocket.accept();// 將該用戶端加入到列表中PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());clientList.add(writer);// 建立ClientHandler對象,通過socket串連通訊Thread t = new Thread(new ClientHandler(clientSocket));t.start();System.out.println("有Client連進來");}}catch(Exception e){e.printStackTrace();}}/** * 用戶端處理類, 主要負責: * 1.接收用戶端發來的訊息 * 2.將訊息轉寄其他用戶端 * @author sdniu * @create 2010-9-26 上午10:00:18 * @version 1.0 */public class ClientHandler implements Runnable{private BufferedReader reader;private Socket socket;/** * ClientHandler的建構函式 * @param clientSocket */public ClientHandler(Socket clientSocket){try{// 得到socket串連socket = clientSocket;// 得到用戶端發來的訊息InputStreamReader isReader = new InputStreamReader(socket.getInputStream());reader = new BufferedReader(isReader);} catch (IOException e){e.printStackTrace();}}public void run(){String message;try{while((message = reader.readLine()) != null){System.out.println("用戶端訊息: " + message);// 將用戶端發來的訊息轉寄所有用戶端notifyAllClients(message);}} catch (IOException e){e.printStackTrace();}}}/** *  * @param message */public void notifyAllClients(String message){// 得到用戶端列表的迭代器,文法格式為 Iterator it = clientList.iterator();Iterator it = clientList.iterator();while(it.hasNext()){try{// 得到的Iterator別忘了強制轉換回PrintWriterPrintWriter writer = (PrintWriter) it.next();writer.println(message);writer.flush();} catch (Exception e){e.printStackTrace();}}}}

8. 多線程Socket編程的例子, 代碼比較長, 放在下載裡了, 連結如下:

     http://files.cnblogs.com/notifier/SimpleChatroom.7z

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.