java Socket 雙向通信(支持直接通過Telnet連接Server並通信)

Socket Server

package com.xbb.demo.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Socket 服務端
 */
public class SocketServer {
    final static int listenPort = 12345;
    public static void main(String[] args) {
        // 啓動服務端
        EchoServer server = new EchoServer(listenPort);
        server.startService();
    }
}
class EchoServer {
    /**
     * 監聽端口
     */
    private int port;

    /**
     * 構造方法
     * @param port
     */
    public EchoServer(int port){
        this.port = port;
    }
    // TODO

    /**
     * 啓動Server
     */
    public void startService(){
        // 創建一個Server
        ServerSocket server = null;
        try {
            // 實例化
            server = new ServerSocket(port);
            // 循環監聽是否有客戶端連接進來
            while (true) {
                // 當有客戶端連接時創建一個獨立的線程與客戶端進行對接
                Socket client = server.accept();
                new Thread(new SSocket(client)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (server != null){
                try{
                    server.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

/**
 * 當有一個Client接入時啓動一個線程來進行交互
 */
class SSocket implements Runnable {
    /**
     * 客戶端
     */
    private Socket client;

    /**
     * 構造方法
     * @param client
     */
    public SSocket(Socket client) {
        this.client = client;
    }

    /**
     * 主方法體
     */
    public void run() {
        // java新特性:把需要關閉的IO可以寫到try()中.這樣就可以不用再在Finally中關閉了
        try(
                // 接收客戶端消息.
                InputStream input = client.getInputStream();
                BufferedReader reader  = new BufferedReader(new InputStreamReader(input));
                // 輸出消息給客戶端
                OutputStream output = client.getOutputStream();
                PrintWriter writer= new PrintWriter(output);
        ) {
            // 歡迎語
            writer.println(EchoConstant.STR_WELCOME);
            writer.flush();
            String msg = "";
            // 循環與客戶端進行交互
            while(true){
                // 讀取客戶端消息
                msg = reader.readLine();
                // 當接收到bye時結束連接
                if (EchoConstant.STR_BYE_CONSOLE.equals(msg) || EchoConstant.STR_BYE_TELNET.equals(msg)){
                    writer.println(EchoConstant.STR_BYE_BYE);
                    writer.flush();
                    client.close();
                    break;
                }else{
                    // 回覆原客戶端發過來的消息
                    writer.println(msg);
                    writer.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (client!=null){
                try{
                    client.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

Socket Client

package com.xbb.demo.socket;

import java.io.*;
import java.net.Socket;

/**
 * Socket 客戶端
 */
public class SocketClient{
    final static int listenPort = 12345;
    public static void main(String[] args) {
        // 啓動客戶端
        EchoClient client = new EchoClient(listenPort);
        client.startService();
    }
}

/**
 * Socket 客戶端
 */
class EchoClient {
    // TODO
    /**
     * 監聽端口
     */
    private int port;

    /**
     * 構造方法
     * @param port
     */
    public EchoClient(int port){
        this.port = port;
    }

    /**
     * 啓動服務
     */
    public void startService(){
        // 定義Socket, IO
        // java新特性:把需要關閉的IO可以寫到try()中.這樣就可以不用再在Finally中關閉了
        try(
                // 實例化客戶端,IO
                Socket socket = new Socket(EchoConstant.SERVER_HOST, port);
                // 輸出信息給客戶端
                OutputStream out = socket.getOutputStream();
                PrintWriter writer= new PrintWriter(out);
                // 接收客戶端消息
                InputStream in = socket.getInputStream();
                BufferedReader reader  = new BufferedReader(new InputStreamReader(in));
                ){
            // 讀取客戶端的歡迎消息
            String ret = reader.readLine();
            System.out.println(ret);
            // 循環讀取用戶在Console輸入的消息並寫給服務端
            BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
            while(true){
                String str = systemIn.readLine();
                writer.println(str);
                writer.flush();
                ret = reader.readLine();
                System.out.println(ret);
                // 收到Bye bye退出
                if (EchoConstant.STR_BYE_BYE.equals(ret)){
                    break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

Telnet 連接服務端

river@RiverJin:~$ telnet 127.0.0.1 12345
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Welcome to My Echo Server
你好
你好
我是你
我是你
你也是我
你也是我
bye
Bye bye
Connection closed by foreign host.
river@RiverJin:~$ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章