Socket 網(wǎng)絡(luò)通信

一、InerAddress 獲取計(jì)算機(jī)信息

        try {
            //獲取本機(jī)InerAddress實(shí)例
            InetAddress address =InetAddress.getLocalHost();
            address.getHostName(); //獲取計(jì)算機(jī)名
            address.getHostAddress(); //獲取計(jì)算機(jī)IP地址
            address.getAddress(); //獲取數(shù)組形式的IP地址
            
            //其他方式獲取InerAddress實(shí)例
            InetAddress address2 = InetAddress.getByName("主機(jī)名");
            InetAddress address3 = InetAddress.getByName("Ip地址");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

二、URL 網(wǎng)絡(luò)資源的地址

        try {
            //創(chuàng)建URL實(shí)例
            URL url = new URL("http://www.baidu.com");
            //根據(jù)已存在的URL創(chuàng)建新的URL
            URL newUrl = new URL(url,"/index.html?username=tom");
            url.getProtocol(); //獲取協(xié)議信息
            url.getHost(); //獲取主機(jī)信息
            url.getPort(); //獲取端口號(hào)
            url.getPath(); //獲取文件路徑
            url.getFile(); //獲取文件名
            url.getRef(); //獲取相對(duì)路徑
            url.getQuery(); //獲取查詢字符串
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
          try {
                InputStream is =url.openStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String data = br.readLine();
                while(data!=null){
                    System.out.println(data);
                    data = br.readLine();
                }
                //釋放資源
                is.close();
                isr.close();
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

三、ServerSocket 服務(wù)器端

        try {
            //1、創(chuàng)建服務(wù)器端Socket
            ServerSocket server = new ServerSocket(8888);
            //2、開始監(jiān)聽,等待客戶端的連接
            Socket socket = server.accept();
            //3、獲取輸入流,讀取客戶端信息
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader bf = new BufferedReader(isr);
            String info = null;
            while((info=bf.readLine())!=null){
                System.out.println("客戶端請(qǐng)求:"+info);
            }
            //4、獲取輸出流,響應(yīng)客戶端請(qǐng)求
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write("服務(wù)器響應(yīng)客戶端");
            pw.flush();
            //5、釋放資源
            server.close();
            socket.shutdownInput();
            is.close();
            isr.close();
            bf.close();
            os.close();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

四、Socket 客戶端

        try {
            //1、創(chuàng)建客戶端Socket,指定服務(wù)器地址和窗口
            Socket socket = new Socket("localhost",8888);
            //2、獲取輸出流,向服務(wù)器端發(fā)送信息
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write("客戶端發(fā)送信息到服務(wù)器端");
            pw.flush();
            socket.shutdownOutput();
            //3、獲取輸入流,讀取服務(wù)器端的響應(yīng)信息
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String info = br.readLine();
            while(info!=null){
                System.out.println("服務(wù)器端相應(yīng):"+info);
            }
            //4、釋放資源
            socket.close();
            os.close();
            pw.close();
            is.close();
            isr.close();
            br.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

五、多線程實(shí)現(xiàn)多客戶端的通信

//服務(wù)器端的多線程類
public class ServerThread extends Thread {
    Socket socket = null;

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

    @Override
    public void run() {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader bf = null;
        OutputStream os = null;
        PrintWriter pw = null;
        try {
            // 響應(yīng)客戶端的請(qǐng)求
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            bf = new BufferedReader(isr);
            String info = null;
            while ((info = bf.readLine()) != null) {
                System.out.println(info);
            }
            // 獲取輸出流,相應(yīng)客戶端請(qǐng)求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("服務(wù)器響應(yīng)客戶端");
            pw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally { // 釋放資源
            try {
                if (is != null)
                    is.close();
                if (isr != null)
                    isr.close();
                if (bf != null)
                    bf.close();
                if (os != null)
                    os.close();
                if (pw != null)
                    pw.close();
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
            //修改服務(wù)器端的接收socket
            Socket socket = null;
            while(true){
                socket = server.accept();
                ServerThread thread = new ServerThread(socket);
                thread.start();

六、實(shí)現(xiàn)基于UDP的Socket通信

        //服務(wù)器端
        try {
            //1、創(chuàng)建服務(wù)器端,指定端口
            DatagramSocket socket = new DatagramSocket(8800);
            //2、創(chuàng)建數(shù)據(jù)報(bào),用于接收客戶端發(fā)送的數(shù)據(jù)
            byte[] data = new byte[1024];
            DatagramPacket packet = new DatagramPacket(data, data.length);
            //3、接收客戶端發(fā)送的數(shù)據(jù)
            socket.receive(packet);
            //4、讀取數(shù)據(jù)
            String info =new String(data,0,packet.getLength());
            System.out.println("客戶端信息:"+info);
            
            //1、創(chuàng)建數(shù)據(jù)報(bào),用于接收服務(wù)器端響應(yīng)的數(shù)據(jù)
            byte[] data1 = new byte[1024];
            DatagramPacket packet1 = new DatagramPacket(data1, data1.length);
            //2、接收服務(wù)器響應(yīng)的數(shù)據(jù)
            socket.receive(packet1);
            //讀取服務(wù)器端響應(yīng)的數(shù)據(jù)
            String reply = new String(data1,0,packet1.getLength());
            System.out.println("服務(wù)器響應(yīng)信息:"+reply);
            //4、釋放資源
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //客戶端
        try {
            //1、定義服務(wù)器端的地址、端口號(hào)、數(shù)據(jù)
            InetAddress address = InetAddress.getByName("localhost");
            int port = 8800;
            byte[] data ="客戶端發(fā)送到服務(wù)器端的信息".getBytes();
            //2、創(chuàng)建數(shù)據(jù)報(bào),包括發(fā)送的數(shù)據(jù)信息
            DatagramPacket packet = new DatagramPacket(data, data.length,address,port);
            //3、創(chuàng)建發(fā)送數(shù)據(jù)的對(duì)象
            DatagramSocket socket = new DatagramSocket();
            //4、向服務(wù)器端發(fā)送數(shù)據(jù)
            socket.send(packet);
            
            //1、定義客戶端的地址、端口號(hào)、數(shù)據(jù)
            InetAddress address1 = packet.getAddress();
            int port1 = packet.getPort();
            byte[] data1 = "服務(wù)器端響應(yīng)客戶端的信息".getBytes();
            //2、創(chuàng)建數(shù)據(jù)報(bào),包含響應(yīng)的數(shù)據(jù)信息
            DatagramPacket packet1 = new DatagramPacket(data1, data1.length,address1,port1);
            //3、響應(yīng)客戶端
            socket.send(packet1);
            //4、釋放資源
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

七、Socket常見問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容