1. 程式人生 > >java套接字(socket)實例

java套接字(socket)實例

監聽 log 測試 ddr cat util print runnable 函數返回

客戶端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();
        }
    }
}

java套接字(socket)實例