首先說一下ServerSocket與Socket.java
ServerSocket是用來監聽客戶端Socket鏈接的類,若是沒有鏈接會一直處於等待狀態.
ServetSocket有三個構造方法:服務器
ServerSocket(int port);
這個使用指定的端口去建立ServerSocket,IP地址使用默認的本地IP地址.網絡
ServetSocket(int port,int backlog);
除了端口外,還有一個用來改變隊列長度參數的backlog,指定當服務器繁忙時,能夠與之保持鏈接請求的客戶端數量,默認爲50.socket
ServetSocket(int port,int backlog,InetAddress ip);
這個使用指定的端口,backlog,ip地址去建立ServerSocket.ide
(這裏簡單提一下InetAddress,InetAddress沒有構造方法,只有兩個靜態方法獲取InetAddress對象,分別是.net
getByName(String hostName); getByAddress(byte[] address);
)線程
Socket通常用來鏈接到服務器,程序經過Socket發出網絡請求或應答網絡請求.
Socket有三個構造方法:3d
Socket(InetAddress address,int port);
使用指定IP與指定端口構造Socket,對於本地地址,默認使用本地ip,對於本地端口則動態分配.code
Socket(String address,int port);
與(1)同樣,使用String表示遠程ip.server
Socket(InetAddress address,int port,InetAddress localAddr,int localPort);
建立指定了遠程ip,遠程端口,本地ip,本地端口的Socket.
Socket(String address,int port,InetAddress localAddr,int localPort)
與(2)相似,使用String表示遠程ip,用InetAddress表示本地ip.
瞭解了ServerSocket與Socket後能夠編寫實現簡單的通訊了.
import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(12345);//這個端口本身隨意,建議1024以上未使用的端口. while(true) { Socket socket = serverSocket.accept();//一直等待來自客戶端的請求. PrintStream printStream = new PrintStream(socket.getOutputStream());//建立輸出流 printStream.println("Server message."); printStream.close(); socket.close(); } } }
說一下ServetSocket的accept()方法:
Socket accept();
沒有參數,返回一個Socket,若是接收到客戶端的一個Socket,則返回,不然一直處於等待狀態,線程也被阻塞.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 12345); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("This message comes from server:"+bufferedReader.readLine()); bufferedReader.close(); socket.close(); } }
Socket socket = new Socket("127.0.0.1", 12345);
表示建立一個本地地址,端口爲12345的Socket,建立好了後服務器的.accept()方法就會接收到這個Socket,並建立輸出流輸出相應信息,而後客戶端從Socket獲取輸入流進行讀取,讀取到了來自服務器的信息.
(因爲做者的漂亮終端不知道什麼緣由壞了....只能讓用VScode的默認終端了....)
先運行服務器端的代碼:
服務器端這邊由於accept()方法會一直阻塞直到客戶端發送請求.
客戶端這邊一運行就收到了來自服務器端的信息.
能夠爲Socket設置超時設置,當Socket超過這個時間沒有鏈接上時系統會認爲鏈接失敗.
Socket socket = new Socket("127.0.0.1",12345); socket.setToTimeout(10000);//單位:ms,在這裏是10s
可是未鏈接上以前沒法建立Socket對象,而且Socket沒有提供指定超時的構造方法,所以常見的作法是先建立一個無鏈接的Socket,再調用connect()方法鏈接.
Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1",12345),12345);
connect()方法其實有兩個重載方法,分別是
void connect(SocketAddress endpoint); void connect(SocketAddress endpoint,int timeout);
對於第一個connect()官方文檔沒有說起超時之類的,就是直接鏈接.
對於第二個connect,timeout指定的超時時間,單位爲ms,設置爲0則爲無限期等待.
這是做者的公衆號.更多精彩文章等待你發現
參考連接
1.socket