二、多線程實現簡單的socket通信實例(TCP)

1.服務器端

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

/**
 * 類功能描述:先啓動服務器端,再啓動客戶端
 *
 * @author:***
 * @createTime:2018/11/5 16:02
 */
public class Server {

    public static void main(String[] args) {
        try {
            //1.創建服務器socket  指定監聽端口
            ServerSocket serverSocket = new ServerSocket(18080);
            //2.調用accept()開始監聽,等待客戶的連接
            System.out.println("---------服務器即將啓動,等待客戶端連接---------");
            int count = 1;
            //3.循環監聽等待客戶端的連接
            while (true) {
                Socket socket = serverSocket.accept();
                ServerThread serverThread = new ServerThread(socket);
                serverThread.start();
                System.out.println("客戶端連接數:" + count++);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

2.線程類

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

/**
 * 類功能描述:服務器線程處理類
 *
 * @author:***
 * @createTime:2018/11/7 9:15
 */
public class ServerThread extends Thread {
    private Socket socket;


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

    @Override
    public void run() {
        BufferedReader br = null;
        PrintWriter pw = null;
        try {
            //3.讀取客戶端發送信息
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("接收到客戶端發送的消息爲:" + br.readLine());
            socket.shutdownInput();
            //4.推送客戶端請求
            pw = new PrintWriter(socket.getOutputStream());
            pw.write("response");
            pw.flush();
            socket.shutdownOutput();
            //5.關閉連接
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
                if (pw != null) {
                    pw.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

3.客戶端類

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

/**
 * 類功能描述:客戶端,啓動多個客戶端
 *
 * @author:***
 * @createTime:2018/11/5 16:03
 */
public class Client {

    public static void main(String[] args) {
        try {
            //1.創建客戶端socket,指定服務器地址和端口
            Socket socket = new Socket("127.0.0.1", 18080);
            //2.向服務器發送信息
            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            pw.write("request");
            pw.flush();
            socket.shutdownOutput();
            //3.讀取服務器推送信息
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("接收到服務器推送的消息爲:" + br.readLine());
            socket.shutdownInput();
            //4.關閉連接
            br.close();
            pw.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章