Java通過ServerSocket與Socket實(shí)現(xiàn)通信過程
1 ServerSocket
ServetSocket是用來監(jiān)聽客戶端Socket連接的類,如果沒有連接會(huì)一直處于等待狀態(tài)。
ServetSocket有三個(gè)構(gòu)造方法:
ServerSocket(int port):這個(gè)使用指定的端口去創(chuàng)建ServerSocket,IP地址使用默認(rèn)的本地IP地址ServetSocket(int port,int backlog):除了端口外,還有一個(gè)用來改變隊(duì)列長度參數(shù)的backlog,指定當(dāng)服務(wù)器繁忙時(shí),可以與之保持連接請(qǐng)求的客戶端數(shù)量,默認(rèn)為50ServetSocket(int port,int backlog,InetAddress ip):這個(gè)使用指定的端口、backlog、地址去創(chuàng)建ServetSocket
需要注意一下InetAddress沒有構(gòu)造方法,只有兩個(gè)靜態(tài)方法獲取InetAddress對(duì)象,分別是:
getByName(String hostName)getByAddress(byte[] address)
2 Socket
Socket一般用來連接到服務(wù)器,程序通過Socket發(fā)出網(wǎng)絡(luò)請(qǐng)求或應(yīng)答網(wǎng)絡(luò)請(qǐng)求。
Socket有四個(gè)構(gòu)造方法:
Socket(InetAddress address,int port):使用指定IP與指定端口構(gòu)造Socket,默認(rèn)使用本地ip,端口則動(dòng)態(tài)分配Socket(String address,int port):使用String表示IPSocket(InetAddress address,int port,InetAddress localAddr,int localPort):創(chuàng)建指定了遠(yuǎn)程IP、遠(yuǎn)程端口、本地IP、本地端口的SocketSocket(String address,int port,InetAddress localAddr,int localPort):使用String表示遠(yuǎn)程IP,用InetAddress表示本地IP
了解ServerSocket與Socket后可以編寫實(shí)現(xiàn)簡單的通信了。
3 服務(wù)器端
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);//這個(gè)端口自己隨意,建議1024以上未使用的端口.
while(true)
{
Socket socket = serverSocket.accept();//一直等待來自客戶端的請(qǐng)求.
PrintStream printStream = new PrintStream(socket.getOutputStream());//創(chuàng)建輸出流
printStream.println("Server message.");
printStream.close();
socket.close();
}
}
}
ServetSocket的accept()方法,沒有參數(shù),返回一個(gè)Socket,如果接收到客戶端的一個(gè)Socket,則返回,否則一直處于等待狀態(tài),線程也被阻塞。
4 客戶端
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();
}
}
代碼邏輯就是創(chuàng)建一個(gè)本地地址,端口為12345的Socket,然后服務(wù)器的socket.accept()就會(huì)接收到這個(gè)Socket,并創(chuàng)建輸出流輸出相應(yīng)信息,然后客戶端從Socket獲取輸入流對(duì)來自服務(wù)器的信息進(jìn)行讀取。
5 運(yùn)行結(jié)果
先運(yùn)行服務(wù)器端的代碼:
服務(wù)器端這邊因?yàn)?code>accept()方法會(huì)一直阻塞直到客戶端發(fā)送請(qǐng)求。

客戶端這邊一運(yùn)行就收到了來自服務(wù)器端的信息。
6 設(shè)置超時(shí)
可以為Socket設(shè)置超時(shí)設(shè)置,當(dāng)Socket超過這個(gè)時(shí)間沒有連接上時(shí)系統(tǒng)會(huì)認(rèn)為連接失敗:
Socket socket = new Socket("127.0.0.1",12345);
socket.setToTimeout(10000);//單位:ms,在這里是10s
但是未連接上之前無法創(chuàng)建Socket對(duì)象,并且Socket沒有提供指定超時(shí)的構(gòu)造方法,因此常見的做法是先創(chuàng)建一個(gè)無連接的Socket,再調(diào)用connect()連接:
Socket socket = new Socket();
socket.connect(new InetSocketAddress("127.0.0.1",12345),12345);
connect()方法其實(shí)有兩個(gè)重載方法:
void connect(SocketAddress endpoint):官方文檔沒有提及超時(shí)之類的,就是直接連接void connect(SocketAddress endpoint,int timeout):timeout指定的超時(shí)時(shí)間,單位為ms,設(shè)置為0則為無限期等待
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求包含實(shí)現(xiàn)過程解析
這篇文章主要介紹了JavaWeb請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求包含實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
基于spring@aspect注解的aop實(shí)現(xiàn)過程代碼實(shí)例
這篇文章主要介紹了基于spring@aspect注解的aop實(shí)現(xiàn)過程代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
使用Spring Boot搭建Java web項(xiàng)目及開發(fā)過程圖文詳解
這篇文章主要介紹了使用Spring Boot搭建Java web項(xiàng)目及開發(fā)過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Java通過數(shù)據(jù)庫表生成實(shí)體類詳細(xì)過程
這篇文章主要介紹了Java通過數(shù)據(jù)庫表生成實(shí)體類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理
這篇文章主要介紹了springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解
這篇文章主要介紹了Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

