java套接字(socket)實例


客戶端socket

流程:

1、連接遠程主機

2、發送數據

3、接收數據

4、關閉流與socket連接

實例:

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

/**
 * Created by CLY on 2017/7/11.
 */
public class ClientSocket {
    public static void main(String[] arg){
        int port = 233;//與之連接的服務端套接字的端口號
        String host = "127.0.0.1";//與之連接的服務端套接字ip地址
        Socket socket = null;
        try {
            //創建socket連接,即在該Socket構造函數返回之前,就會與遠程主機建立連接,如果未能連接,則會拋出異常。
            socket = new Socket(host, port);

            //獲取輸出流,向服務器端發送當前時間
            OutputStream outputStream = socket.getOutputStream();
            Writer writer = new OutputStreamWriter(outputStream);
            String now_date = new Date().toString();
            writer.write("客戶端當前時間為——"+now_date);
            writer.flush();
            ////關閉客戶端的輸出流。相當於給流中加入一個結束標記-1.這個樣子服務器的輸入流的reaLine方法就會讀到一個-1,然后結束readLIne方法。
            socket.shutdownOutput();

            //獲取輸入流,並讀取服務器端的響應信息
            InputStream inputStream= socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String server_info = null;
            while((server_info=br.readLine())!=null){
                System.out.println("服務端傳過來的值:"+server_info);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //如果socket不為null,則釋放掉它
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

服務端Socket

流程:

1、綁定端口

2、監聽入站數據

3、在綁定的端口上接受來自遠程機器的連接

4、接收數據

5、發送數據

6、關閉流與socket連接

實例:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by CLY on 2017/7/11.
 */
public class MyServerSocket {
    public static void main(String[] arg){
        /**
         * 根據tcp協議可知,所謂套接字(socket)是指一個由“ip地址+端口”組成的組合。
         * 而每一台主機的ip地址都是確定的,不需要我們來指定,
         * 所以構建服務器socket的第一步就是確定端口
         */
        try {
            int port = 233;//端口號
            int queueLength = 50;//最大入站連接
            InetAddress bindAddress = InetAddress.getByName("127.0.0.1");//只監聽該ip的指定端口
            ExecutorService pool = Executors.newFixedThreadPool(50);//創建一個最大容量為50的線程池,為每一個入站連接分配一條線程。

            //創建一個端口為“233”的服務器socket
            ServerSocket serverSocket = new ServerSocket(port);

            //創建一個端口為233的服務器socket,且隊列一次最多能保存50個入站連接
            //ServerSocket serverSocket = new ServerSocket(port,queueLength);

            //假設一台主機有多個ip地址,則服務器socket會默認在所有ip地址的指定端口上監聽,但可以指定其只監聽指定ip的端口。
            //ServerSocket serverSocket = new ServerSocket(port,queueLength,bindAddress);

            while (true){
                //accept()調用會阻塞,會一直等到有客戶端連接到指定socket端口為止。
                final Socket connection = serverSocket.accept();

                //線程池中拿取一條線程來處理socket連接。然后主程序運行下一個循環,繼續等待下一個客戶端的訪問。
                pool.execute(new Runnable() {
                    public void run() {
                        try {
                            //從輸入流中讀取獲取客戶端傳過來的值
                            InputStream inputStream= connection.getInputStream();
                            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                            String client_info = null;
                            while((client_info=br.readLine())!=null){
                                System.out.println("客戶端傳過來的值:"+client_info);
                            }

                            //測試:將當前時間寫入流中返回給客戶端
                            Writer writer = new OutputStreamWriter(connection.getOutputStream());
                            String nowData = new Date().toString();
                            writer.write("服務端當前時間為——"+nowData);
                            writer.flush();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                //關閉socket連接
                                connection.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM