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


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


          網站導航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 平塘县| 寻乌县| 襄垣县| 蒙自县| 从江县| 伽师县| 惠来县| 聂拉木县| 新龙县| 蓬溪县| 米林县| 尼玛县| 青河县| 舞阳县| 泸水县| 新邵县| 新巴尔虎左旗| 资阳市| 砚山县| 洱源县| 蓝山县| 塔河县| 靖州| 余干县| 峨山| 南乐县| 双鸭山市| 井陉县| 青岛市| 兰坪| 雷州市| 黎城县| 夏邑县| 沧源| 垣曲县| 定陶县| 桂林市| 扎囊县| 陇南市| 南和县| 洮南市|