ServerSocket類的常用方法


1.accept:偵聽並接受此套接字的連接;此方法在連接傳入之前一直阻塞。

2.setSoTimeout(timeout)方法的作用時設置超時時間,通過指定超時timeout值啟用/禁用超時功能,以ms為單位。

  必須在進入阻塞前調用這個方法,才能生效,一旦超時,程序會觸發SocketTimeoutException異常;默認值是0即永遠等待。

 

Server.java

package com.company.s7;

import java.io.IOException;
import java.net.ServerSocket;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket=new ServerSocket(8000);
            System.out.println(serverSocket.getSoTimeout());
            serverSocket.setSoTimeout(4000);
            System.out.println(serverSocket.getSoTimeout());
            System.out.println();

            System.out.println("begin "+System.currentTimeMillis());
            serverSocket.accept();
            System.out.println(" end "+System.currentTimeMillis());
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

Client.java

package com.company.s7;

import java.io.IOException;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            System.out.println("client begin "+System.currentTimeMillis());
            Socket socket=new Socket("localhost",8000);
            System.out.println("client end "+System.currentTimeMillis());
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("catch "+System.currentTimeMillis());
        }
    }
}

 

backlog參數含義:

允許接受客戶端連接請求的個數。

如果隊列已滿,則拒接該連接。

blacklog參數如果小於等於0,則使用默認值50;

Server.java

package com.company.s71;

import javax.sound.midi.Soundbank;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket serverSocket=new ServerSocket(8088,3);

        //sleep(5000)的作用是不讓ServerSocket調用accept()方法,
        //而是由客戶端Socket先發奇10個連接請求
        //然后在執行accept方法時只能接收3個連接
        Thread.sleep(5000);

        System.out.println("accept1 begin");
        Socket socket1=serverSocket.accept();
        System.out.println("accept1 end");

        System.out.println("accept2 begin");
        Socket socket2=serverSocket.accept();
        System.out.println("accept2 end");

        System.out.println("accept3 begin");
        Socket socket3=serverSocket.accept();
        System.out.println("accept3 end");

        System.out.println("accept4 begin");
        Socket socket4=serverSocket.accept();
        System.out.println("accept4 end");

        System.out.println("accept5 begin");
        Socket socket5=serverSocket.accept();
        System.out.println("accept5 end");

        socket1.close();
        socket2.close();
        socket3.close();
        socket4.close();
        socket5.close();

        serverSocket.close();
    }
}

Client.java

package com.company.s71;

import java.io.IOException;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket1=new Socket("localhost",8088);
        Socket socket2=new Socket("localhost",8088);
        Socket socket3=new Socket("localhost",8088);
        Socket socket4=new Socket("localhost",8088);
      //  Socket socket5=new Socket("localhost",8088);

    }
}

先啟動server.java,然后快速的啟動client.java;

但是讓我很奇怪的是服務端啟動五秒之后,再啟動客戶端,反而能正確的執行;

如果由知道的人,請留言區告知,謝謝。


免責聲明!

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



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