中文JAVA技術平等自由協作創造

          Java專題文章博客和開源

          常用鏈接

          統計

          最新評論

          Java的Socket網絡編程以及多線程

            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. 關閉輸入流BufferedReader
           
             br.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. 關閉輸入流BufferedReader
           
             br.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連接,監聽端口號5000
           
             ServerSocket 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別忘了強制轉換回PrintWriter
           
             PrintWriter writer = (PrintWriter) it.next();
           
             writer.println(message);
           
             writer.flush();
           
             } catch (Exception e)
           
             {
           
             e.printStackTrace();
           
             }
           
             }
           
             }
           
             }
           
           

          posted on 2013-10-02 17:47 好不容易 閱讀(241) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 衡东县| 环江| 镇沅| 阳山县| 大冶市| 锡林郭勒盟| 永修县| 西畴县| 乐清市| 泗水县| 牟定县| 南和县| 阳城县| 阿荣旗| 晋州市| 澎湖县| 定襄县| 集贤县| 张家口市| 沐川县| 福鼎市| 铁岭县| 竹北市| 南皮县| 格尔木市| 盈江县| 栖霞市| 鸡泽县| 南召县| 翼城县| 大关县| 繁昌县| 沐川县| 吕梁市| 日照市| 株洲县| 宜宾县| 延安市| 白银市| 福鼎市| 新昌县|