【六】Java IO 代碼例子(網絡和文件)

一、網絡IO TCP

服務端啓動引導

public class ServerBoot {

    private static final int PORT = 8000;

    public static void main(String[] args) {
        Server server = new Server(PORT);
        /**start裏面新建了一個線程用於接受客戶端請求,
         * 接收到客戶端請求後又爲每個請求創建work線程去處理邏輯*/
       server.start();
    }

}

服務端創建一個線程接受連接,收到連接後調用監聽數據的模塊


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 {
                /**accept是個阻塞方法 這個while(true)搭配accept()不斷監聽是否有客戶端連接上來了*/
                Socket client = serverSocket.accept();
                /**start()中爲每個連接新建了線程來監聽該連接上是否有數據傳過來了*/
                new ClientHandler(client).start();
            } catch (IOException e) {
                System.out.println("服務端異常");
            }
        }
    }
}

邏輯處理模塊:爲每個連接創建一個線程用於監聽該連接上是否有數據過來


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 = socket.getInputStream();
            /**這個while(true)搭配inputStream.read不斷地監聽這個連接上是否有數據過來了*/
            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();
        }
    }
}

客戶端

package com.imooc.netty.ch2;

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 = socket.getInputStream();
            /**這個while(true)搭配inputStream.read不斷地監聽這個連接上是否有數據過來了*/
            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();
        }
    }
}

二、網絡IO UDP

服務端

package com.sid.io;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {
    public static void main(String args[]){
        try {
            DatagramSocket serversocket=new DatagramSocket(7777);
            byte[] data=new byte[1024];
            DatagramPacket packet=new DatagramPacket(data,data.length);
            System.out.println("服務器已啓動......");
            //阻塞
            serversocket.receive(packet);
            String s=new String(data,0,packet.getLength());
            System.out.println("get client:"+s);

            DatagramSocket clientsocket=new DatagramSocket();
            String senddata="welcome to you visit ";
            byte[] bytes=senddata.getBytes();
            InetAddress ip=packet.getAddress();
            int port=packet.getPort();
            DatagramPacket p=new DatagramPacket(bytes,0,senddata.length(),ip,port);
            clientsocket.send(p);
        } catch (SocketException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客戶端

package com.sid.io;

import java.io.IOException;
import java.net.*;

public class UDPClient {
    public static void main(String args[]){
        try {
            DatagramSocket clientsocket=new DatagramSocket();
            String senddata="hello my name is zyw";
            byte[] bytes=senddata.getBytes();
            InetAddress ip=InetAddress.getByName("127.0.0.1");
            DatagramPacket packet=new DatagramPacket(bytes,0,senddata.length(),ip,7777);
            clientsocket.send(packet);
            byte data[]=new byte[1024];
            DatagramPacket packet1=new DatagramPacket(data,0,data.length);
            clientsocket.receive(packet1);
            String s=new String(data,0,packet1.getLength());
            System.out.println("server say:"+s);
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、本地文件IO

將鍵盤錄入的數據保存到一個文件中,輸入“over”時表示錄入結束

public class FileIO {
    public static void main(String[] args) throws IOException {
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufw=new BufferedWriter(new FileWriter("readin.txt"));
        String line=null;
        while((line=bufr.readLine())!=null)
        {
            if("over".equals(line)) break;
            bufw.write(line);
            bufw.newLine();
        }
        bufw.close();
        bufr.close();

    }
}

 

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