<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文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 好不容易 閱讀(237) 評論(0)  編輯  收藏


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


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 亚洲精品你懂的在线观看| 曰批全过程免费视频在线观看| 国产美女无遮挡免费视频| 亚洲国产精品无码观看久久| 成年女人免费v片| 亚洲av综合av一区二区三区| 免费a级毛片在线观看| 美女视频黄频a免费观看| 亚洲AV无码乱码在线观看| 精品一区二区三区高清免费观看 | 亚洲欧美熟妇综合久久久久| 欧美三级在线电影免费| 亚洲成a人无码亚洲成www牛牛| 国产免费拔擦拔擦8x| jizz18免费视频| 亚洲精品免费视频| 猫咪社区免费资源在线观看| 亚洲午夜无码毛片av久久京东热| 日韩毛片无码永久免费看| 永久免费无码网站在线观看个| 亚洲国产精品一区二区久久hs| 中文字幕免费视频一| 亚洲色中文字幕在线播放| 四虎永久免费观看| 免费91最新地址永久入口 | 亚洲AV人无码激艳猛片| 久久久久久久91精品免费观看| 欧洲亚洲国产精华液| 在线亚洲人成电影网站色www| 一级毛片免费观看不卡的| 亚洲夂夂婷婷色拍WW47| 国产成人A亚洲精V品无码| 永久免费在线观看视频| 免费亚洲视频在线观看| 亚洲国产成人精品不卡青青草原| 毛片A级毛片免费播放| 中文永久免费观看网站| 国产精品亚洲一区二区麻豆| 亚洲人成亚洲人成在线观看| 一个人在线观看视频免费 | 国产无人区码卡二卡三卡免费|