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

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

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

    中文JAVA技術平等自由協(xié)作創(chuàng)造

    Java專題文章博客和開源

    常用鏈接

    統(tǒng)計

    最新評論

    Java的Socket網(wǎng)絡編程以及多線程

      1.Socket是代表兩臺機器之間網(wǎng)絡連接的對象(java.net.Socket)。
     
       Socket的建立如下,參數(shù)分別是服務器端的IP地址和端口號: Socket socket = new Socket("167.5.75.1",5000);
     
       2.客戶端(Client)Socket的使用
     
       2.1 從Socket讀出數(shù)據(jù)步驟:
     
       // 1.創(chuàng)建Socket連接,告知Server的IP地址以及端口號
     
       Socket socket = new Socket("127.0.0.1", 4242);
     
       // 2.創(chuàng)建InputStreamReader,用于讀取socket輸入流
     
       InputStreamReader stream = new InputStreamReader(socket.getInputStream());
     
       // 3.使用BufferedReader鏈接輸入流
     
       BufferedReader br = new BufferedReader(stream);
     
       // 4.讀出數(shù)據(jù)
     
       String line = null;
     
       while ((line = br.readLine()) != null)
     
       {
     
       System.out.println("Today's advice is: " + line);
     
       }
     
       // 5. 關閉輸入流BufferedReader
     
       br.close();
     
       2.2 向Scoket寫入數(shù)據(jù)步驟:
     
       // 1.創(chuàng)建Socket連接,告知Server的IP地址以及端口號
     
       Socket socket = new Socket("127.0.0.1", 4242);
     
       // 2.創(chuàng)建PrintWriter對象,用以接收socket輸出流
     
       PrintWriter writer = new PrintWriter(socket.getOutputStream());
     
       // 3.使用PrintWriter對象寫出輸出數(shù)據(jù)
     
       String advice ="Today's advice";
     
       writer.println(advice);
     
       // 4. 關閉連接
     
       writer.close();
     
       3. 服務器端(Server)Socket的使用
     
       // 1.創(chuàng)建一個SercerSocket,使用4242端口監(jiān)聽客戶端請求
     
       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.創(chuàng)建PrintWriter對象,用以接收socket輸出流
     
       PrintWriter writer = new PrintWriter(socket.getOutputStream());
     
       // 4.使用PrintWriter對象寫出輸出數(shù)據(jù)
     
       String advice = "notifier's blog";
     
       writer.println(advice);
     
       // 5. 關閉連接
     
       writer.close();
     
       }
     
       4. 線程的狀態(tài)
     
       線程總共有5種狀態(tài):
     
       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.創(chuàng)建Socket連接,告知Server的IP地址以及端口號
     
       Socket socket = new Socket("127.0.0.1", 4242);
     
       // 2.創(chuàng)建InputStreamReader,用于讀取socket輸入流
     
       InputStreamReader stream = new InputStreamReader(socket
     
       .getInputStream());
     
       // 3.使用BufferedReader鏈接輸入流
     
       BufferedReader br = new BufferedReader(stream);
     
       // 4.讀出數(shù)據(jù)
     
       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
     
       {
     
       // 創(chuàng)建服務器端ServerSocket連接,監(jiān)聽端口號5000
     
       ServerSocket serverSocket = new ServerSocket(5000);
     
       // 輪詢等待客戶端請求
     
       while(true)
     
       {
     
       // 等待客戶端請求,無請求則閑置;有請求到來時,返回一個對該請求的socket連接
     
       Socket clientSocket = serverSocket.accept();
     
       // 將該客戶端加入到列表中
     
       PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
     
       clientList.add(writer);
     
       // 創(chuàng)建ClientHandler對象,通過socket連接通信
     
       Thread t = new Thread(new ClientHandler(clientSocket));
     
       t.start();
     
       System.out.println("有Client連進來");
     
       }
     
       }catch(Exception e)
     
       {
     
       e.printStackTrace();
     
       }
     
       }
     
       /**
     
       * 客戶端處理類, 主要負責:
     
       * 1.接收客戶端發(fā)來的消息
     
       * 2.將消息轉(zhuǎn)發(fā)其他客戶端
     
       * @author sdniu
     
       * @create 2010-9-26 上午10:00:18
     
       * @version 1.0
     
       */
     
       public class ClientHandler implements Runnable
     
       {
     
       private BufferedReader reader;
     
       private Socket socket;
     
       /**
     
       * ClientHandler的構造函數(shù)
     
       * @param clientSocket
     
       */
     
       public ClientHandler(Socket clientSocket)
     
       {
     
       try
     
       {
     
       // 得到socket連接
     
       socket = clientSocket;
     
       // 得到客戶端發(fā)來的消息
     
       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);
     
       // 將客戶端發(fā)來的消息轉(zhuǎn)發(fā)所有客戶端
     
       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別忘了強制轉(zhuǎn)換回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)  編輯  收藏


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


    網(wǎng)站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 九九精品免费视频| 亚洲第一页在线播放| 综合偷自拍亚洲乱中文字幕| 无码免费午夜福利片在线| jlzzjlzz亚洲jzjzjz| 精品一区二区三区免费毛片爱| 久久伊人久久亚洲综合| 麻豆精品不卡国产免费看| 亚洲Av无码精品色午夜| 99精品视频在线观看免费专区| 亚洲精品在线免费看| 免费人成视频在线| 亚洲大尺度无码无码专线一区 | 成人浮力影院免费看| 亚洲国产成人精品无码一区二区| 一二三四在线观看免费高清中文在线观看| 亚洲人成人网毛片在线播放| 国产午夜免费秋霞影院| 亚洲一区二区三区免费| 亚洲AV日韩精品久久久久久| 久久精品免费一区二区| 亚洲AV香蕉一区区二区三区| 亚洲女同成人AⅤ人片在线观看| 两个人看的www免费| 色婷婷六月亚洲婷婷丁香| 丁香花在线观看免费观看| 污污免费在线观看| 久久精品国产亚洲av麻| 国产免费久久精品99re丫y| 国产青草亚洲香蕉精品久久| 亚洲国产精品无码一线岛国| 免费人成视频在线| 国产精品美女免费视频观看| 亚洲精品视频观看| 免费一级毛片正在播放| 免费A级毛片无码专区| 亚洲高清一区二区三区电影| 久久亚洲精品成人777大小说| 最近最好的中文字幕2019免费 | 亚洲中文字幕无码永久在线| 18禁男女爽爽爽午夜网站免费|