1. 程式人生 > >建立一個簡單的socket連線

建立一個簡單的socket連線

1、建立一個簡單的socket連線。

當客戶端與服務端進行通訊時,服務端首先監聽埠,程式中監聽本地8000埠,通過while(true)輪詢,不斷地去accept方法(阻塞的)連線,這時客戶端如果建立連線,服務端都能拿到這個連線,對應扔給處理器去處理客戶端連線,這個連線建立完成之後,客戶端就將資料寫入服務端,那麼對於服務端就是接收資料過程,服務端接收到資料要進行一系列的處理。

2、啟動服務端。

package com.waylau.Netty;

/**
 * socketDemo
 */
public class SocketDemo {
    private static final int PORT = 8000;

    public static void main(String[] args) {
        //建立服務端,傳入監聽的PORT埠號
        Server server = new Server(PORT);
        server.start();
    }
}

3、服務端。

package com.waylau.Netty;

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

public class Server {

    private ServerSocket serverSocket;

    public Server(int port) {
        try {
            this.serverSocket = new ServerSocket(port);
            System.out.println("服務端啟動成功,埠:" + port);
        } catch (IOException exception) {
            System.out.println("服務端啟動失敗");
        }
    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                doStart();
            }
        }).start();
    }

    private void doStart() {
        while (true) {
            try {
                //accpet阻塞的
                Socket client = serverSocket.accept();
                new ClientHandler(client).start();
            } catch (IOException e) {
                System.out.println("服務端異常");
            }
        }
    }
}

4、客戶端。

package com.waylau.Netty;

import java.io.IOException;
import java.net.Socket;

public class Client {
    private static final String HOST = "127.0.0.1";
    private static final int PORT = 8000;
    private static final int SLEEP_TIME = 5000;

    public static void main(String[] args) throws IOException {
        final Socket socket = new Socket(HOST, PORT);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("客戶端啟動成功!");
                while (true) {
                    try {
                        String message = "hello world";
                        System.out.println("客戶端傳送資料: " + message);
                        socket.getOutputStream().write(message.getBytes());
                    } catch (Exception e) {
                        System.out.println("寫資料出錯!");
                    }
                    sleep();
                }


            }
        }).start();

    }

    private static void sleep() {
        try {
            Thread.sleep(SLEEP_TIME);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

5、服務端處理客戶端資料的物件。

package com.waylau.Netty;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ClientHandler {

    public static final int MAX_DATA_LEN = 1024;
    private final Socket socket;

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    public void start() {
        System.out.println("新客戶端接入");
        new Thread(new Runnable() {
            @Override
            public void run() {
                doStart();
            }
        }).start();
    }

    private void doStart() {
        try {
            //通過InputStream獲得客戶端傳來的資料
            InputStream inputStream = socket.getInputStream();
            while (true) {
                byte[] data = new byte[MAX_DATA_LEN];
                int len;
                while ((len = inputStream.read(data)) != -1) {
                    String message = new String(data, 0, len);
                    System.out.println("客戶端傳來訊息: " + message);
                    socket.getOutputStream().write(data);
                }

            }


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

5、結果。