首先說一下ServerSocket與Socket.
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的瓊海網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!ServerSocket是用來監(jiān)聽客戶端Socket連接的類,如果沒有連接會一直處于等待狀態(tài).
ServetSocket有三個構(gòu)造方法:
ServerSocket(int port);
這個使用指定的端口去創(chuàng)建ServerSocket,IP地址使用默認的本地IP地址.
ServetSocket(int port,int backlog);
除了端口外,還有一個用來改變隊列長度參數(shù)的backlog,指定當服務(wù)器繁忙時,可以與之保持連接請求的客戶端數(shù)量,默認為50.
ServetSocket(int port,int backlog,InetAddress ip);
這個使用指定的端口,backlog,ip地址去創(chuàng)建ServerSocket.
(這里簡單提一下InetAddress,InetAddress沒有構(gòu)造方法,只有兩個靜態(tài)方法獲取InetAddress對象,分別是
getByName(String hostName);
getByAddress(byte[] address);
)
Socket一般用來連接到服務(wù)器,程序通過Socket發(fā)出網(wǎng)絡(luò)請求或應(yīng)答網(wǎng)絡(luò)請求.
Socket有三個構(gòu)造方法:
Socket(InetAddress address,int port);
使用指定IP與指定端口構(gòu)造Socket,對于本地地址,默認使用本地ip,對于本地端口則動態(tài)分配.
Socket(String address,int port);
與(1)一樣,使用String表示遠程ip.
Socket(InetAddress address,int port,InetAddress localAddr,int localPort);
創(chuàng)建指定了遠程ip,遠程端口,本地ip,本地端口的Socket.
Socket(String address,int port,InetAddress localAddr,int localPort)
與(2)類似,使用String表示遠程ip,用InetAddress表示本地ip.
了解了ServerSocket與Socket后可以編寫實現(xiàn)簡單的通信了.
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());//創(chuàng)建輸出流
printStream.println("Server message.");
printStream.close();
socket.close();
}
}
}
說一下ServetSocket的accept()方法:
Socket accept();
沒有參數(shù),返回一個Socket,如果接收到客戶端的一個Socket,則返回,否則一直處于等待狀態(tài),線程也被阻塞.
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);
表示創(chuàng)建一個本地地址,端口為12345的Socket,創(chuàng)建好了后服務(wù)器的.accept()方法就會接收到這個Socket,并創(chuàng)建輸出流輸出相應(yīng)信息,然后客戶端從Socket獲取輸入流進行讀取,讀取到了來自服務(wù)器的信息.
(由于作者的漂亮終端不知道什么原因壞了....只能讓用VScode的默認終端了....)
先運行服務(wù)器端的代碼:
服務(wù)器端這邊因為accept()方法會一直阻塞直到客戶端發(fā)送請求.
客戶端這邊一運行就收到了來自服務(wù)器端的信息.
可以為Socket設(shè)置超時設(shè)置,當Socket超過這個時間沒有連接上時系統(tǒng)會認為連接失敗.
Socket socket = new Socket("127.0.0.1",12345);
socket.setToTimeout(10000);//單位:ms,在這里是10s
但是未連接上之前無法創(chuàng)建Socket對象,并且Socket沒有提供指定超時的構(gòu)造方法,因此常見的做法是先創(chuàng)建一個無連接的Socket,再調(diào)用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,設(shè)置為0則為無限期等待.
參考鏈接
socket
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。