基於Socket簡單的客戶端-服務端例子

客戶端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 首先創建socket對象client,用於建立和服務器段端的通信;
 * 然後通過調用socket的方法獲得遠程服務器地址,
 * 利用數據處理流(DatainputStrem、DataOutputStream)處理通信信息並打印
 *@package 
 *@project LearningJava
 */

public class GreetingClient {

    public static void main(String[] args) {
        String serverName = "localhost";
        int port = 6066;

        try {
            System.out.println("Connecting to " + serverName + "at port" + port);
            Socket client = new Socket(serverName, port);

            String server_address = client.getRemoteSocketAddress().toString();
            System.out.println("Connection to " + server_address);

            OutputStream outToserver = client.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToserver);

            out.writeUTF("Hello from " + client.getLocalAddress());

            InputStream inFromserver = client.getInputStream();
            DataInputStream in = new DataInputStream(inFromserver);
            System.out.println("Says from Server: " + in.readUTF());

            client.close();

        } catch (IOException e) {
            e.getStackTrace();
        }

    }

}

服務器端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;

/**
 * 使用socket實現服務器和客戶端的通信,
 * 服務器端創建一個socket對象,客戶端和服務器端通過對這個socket對象讀取和寫入來實現通信
 * 通信過程:
 * 
 * 1)服務器實例化一個socket對象(本例中serversocket),通過這個對象實現端口通信;
 * 2)服務器端調用serversocket對象的accept方法,這個方法一直等待客戶端連接到服務器給定的端口;
 * 3)accept等待時客戶端也實例化一個socket對象,這個對象根據指定的服務器名稱和端口號進行通信;
 * 4)通過服務器端的構造方法設定端口和服務器名稱,本例中默認是localhost和6066端口,於是客戶端根據信息創建socket進行通信
 * 服務器端accept()返回服務器上一個新的socket引用,這個socket連接到客戶端的socket
 */
public class GreetingServer extends Thread {
    private ServerSocket serverSocket;

    public GreetingServer(int port) throws IOException {
        //通過構造方法設定通信端口
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(100000);

    }

    @Override
    public void run() {
        while (true) {
            try {
                System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
                //調用accept方法等待
                Socket server = serverSocket.accept();
                System.out.println("Just connected to " + server.getRemoteSocketAddress());
                //通過處理流來獲取客戶單傳遞過來的信息並打印
                DataInputStream in = new DataInputStream(server.getInputStream());
                System.out.println(in.readUTF());
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!");
                //關閉socket
                server.close();
            } catch (SocketTimeoutException s) {
                System.out.println("Socket timed out!");
                break;
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
    }

    public static void main(String[] args) {

        //      System.out.println("input your port: ");
        //      Scanner scan = new Scanner(System.in);
        //      int port = 0;
        //
        //      while (scan.hasNextInt()) {
        //          port = scan.nextInt();
        //      }

        try {
            Thread t = new GreetingServer(6066);
            t.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章