close

使用Java本身提供的

ServerSocketSocket來進行連線的動作

且ServerSocket的接受連線方法accept()會讓程式停頓(直到成功連線為止),所以必須使用Thread

 

分為Server和Client兩部分的程式碼,在此我將其放在同個Project內...

Package內New → Class,命名為ServerCode,來撰寫伺服器端的程式碼。不過由於連線部分需要使用Thread,所以在另外新增一個Class,命名為ServerThreadCode

以及一個Class命名為ClientCode,來撰寫客戶端的程式碼。一樣需要使用到Thread,所以另外新增一個Class,命名為ClientThreadCode

 

 

ServerCode程式碼


public class ServerCode
{
    public static void main(String[] argv)
    {
        new ServerThreadCode(8000).start();//建立物件,傳入Port並執行等待接受連線的動作
    }
}


 

 

 

ServerThreadCode程式碼


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ServerThreadCode extends Thread
{
    private ServerSocket m_serverSocket;//伺服器端的Socket,接收Client端的連線
    private Socket m_socket;//Server和Client之間的連線通道
    
    public ServerThreadCode(int port)
    {
        try
        {
            m_serverSocket = new ServerSocket(port);//建立伺服器端的Socket,並且設定Port
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());//出現例外時,捕捉並顯示例外訊息
        }
    }
    
    @Override
    public void run()//覆寫Thread內的run()方法
    {
        try
        {
            System.out.println("等待連線......");
            m_socket = m_serverSocket.accept();//等待伺服器端的連線,若未連線則程式一直停在這裡
            System.out.println("連線成功!");
            
            m_serverSocket.close();//一旦連線建立成功,且不需要再接收其他連線,則可關閉ServerSocket
            
            //送出端的編寫必須和接收端的接收Class相同
            //使用Socket的getInputStream()和getOutputStream()進行接收和發送資料
            //想要寫入字串可以用 PrintStream;想要把各種基本資料型態,如 int, double...等的 "值" 輸出,可以用 DataOutputStream;想要把整個物件 Serialize,則可以用 ObjectOutputStream。
            PrintStream writer;//在此我使用PrintStream將字串進行編寫和送出
            BufferedReader reader;//在此我使用BufferedReader將資料進行接收和讀取
            
            writer = new PrintStream(m_socket.getOutputStream());//由於是將資料編寫並送出,所以是Output

            //BufferedReader在建構時接受一個Reader物件,在讀取標準輸入串流時,會使用InputStreamReader,它繼承了Reader類別
            reader = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));//接收傳進來的資料,所以是Input
            
            System.out.println("Client: " + reader.readLine());//讀取一行字串資料
            
            SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");//設定時間格式
            String nowDate = sdFormat.format(new Date());//取得現在時間
            
            writer.println("現在時間是:" + nowDate);//將資料編寫進串流內
            writer.flush();//清空緩衝區並送出資料
            
            m_socket.close();//關閉連線
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());//出現例外時,捕捉並顯示例外訊息(連線成功不會出現例外)
        }
    }
}


 

 

 

再來是ClientCode程式碼


public class ClientCode
{
    public static void main(String[] argv)
    {
        new ClientThreadCode("127.0.0.1", 8000).start();//建立物件,傳入IP和Port並執行等待接受連線的動作
        //由於此範例都在自己電腦上執行,所以IP設定為127.0.0.1
    }
}


 

 

 

ClientThreadCode程式碼(和Server端雷同,所以註解寫得不多)


 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ClientThreadCode extends Thread
{
    private Socket m_socket;//和伺服器端進行連線
    
    public ClientThreadCode(String ip, int port)
    {
        try
        {
            m_socket = new Socket(ip, port);//建立連線。(ip為伺服器端的ip,port為伺服器端開啟的port)
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
        }
    }
    
    @Override
    public void run()
    {
        try
        {
            if (m_socket != null)//連線成功才繼續往下執行
            {

                //由於Server端使用 PrintStream 和 BufferedReader 來接收和寄送訊息,所以Client端也要相同
                PrintStream writer = new PrintStream(m_socket.getOutputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
            
                writer.println("現在時間是?");
                writer.flush();
                System.out.println("Server:" + reader.readLine());
            
                m_socket.close();

            }
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
        }
    }
}


 

 

執行後的結果...(Server端)

只有Server執行(未連線)

 

當Client也執行時(已連線)

 

執行後的結果...(Client端)

(已連線)

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Yang 的頭像
    Yang

    Yang的部落格(轉貼文章請註記來源)

    Yang 發表在 痞客邦 留言(5) 人氣()