溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java通過ServerSocket與Socket實(shí)現(xiàn)通信

發(fā)布時間:2020-07-02 04:06:09 來源:網(wǎng)絡(luò) 閱讀:180 作者:2578612215 欄目:編程語言

首先說一下ServerSocket與Socket.

1.ServerSocket

ServerSocket是用來監(jiān)聽客戶端Socket連接的類,如果沒有連接會一直處于等待狀態(tài).
ServetSocket有三個構(gòu)造方法:

(1)

ServerSocket(int port);

這個使用指定的端口去創(chuàng)建ServerSocket,IP地址使用默認(rèn)的本地IP地址.

(2)

ServetSocket(int port,int backlog);

除了端口外,還有一個用來改變隊(duì)列長度參數(shù)的backlog,指定當(dāng)服務(wù)器繁忙時,可以與之保持連接請求的客戶端數(shù)量,默認(rèn)為50.

(3)

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);

)

2.Socket

Socket一般用來連接到服務(wù)器,程序通過Socket發(fā)出網(wǎng)絡(luò)請求或應(yīng)答網(wǎng)絡(luò)請求.
Socket有三個構(gòu)造方法:

(1)

Socket(InetAddress address,int port);

使用指定IP與指定端口構(gòu)造Socket,對于本地地址,默認(rèn)使用本地ip,對于本地端口則動態(tài)分配.

(2)

Socket(String address,int port);

與(1)一樣,使用String表示遠(yuǎn)程ip.

(3)

Socket(InetAddress address,int port,InetAddress localAddr,int localPort);

創(chuàng)建指定了遠(yuǎn)程ip,遠(yuǎn)程端口,本地ip,本地端口的Socket.

(4)

Socket(String address,int port,InetAddress localAddr,int localPort)

與(2)類似,使用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);//這個端口自己隨意,建議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),線程也被阻塞.

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();
    }
}
Socket socket = new Socket("127.0.0.1", 12345);

表示創(chuàng)建一個本地地址,端口為12345的Socket,創(chuàng)建好了后服務(wù)器的.accept()方法就會接收到這個Socket,并創(chuàng)建輸出流輸出相應(yīng)信息,然后客戶端從Socket獲取輸入流進(jìn)行讀取,讀取到了來自服務(wù)器的信息.

5.運(yùn)行結(jié)果

(由于作者的漂亮終端不知道什么原因壞了....只能讓用VScode的默認(rèn)終端了....)

先運(yùn)行服務(wù)器端的代碼:

java通過ServerSocket與Socket實(shí)現(xiàn)通信

服務(wù)器端這邊因?yàn)閍ccept()方法會一直阻塞直到客戶端發(fā)送請求.

java通過ServerSocket與Socket實(shí)現(xiàn)通信

客戶端這邊一運(yùn)行就收到了來自服務(wù)器端的信息.

6.Socket設(shè)置超時

可以為Socket設(shè)置超時設(shè)置,當(dāng)Socket超過這個時間沒有連接上時系統(tǒng)會認(rèn)為連接失敗.

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()方法其實(shí)有兩個重載方法,分別是

void connect(SocketAddress endpoint);
void connect(SocketAddress endpoint,int timeout);

對于第一個connect()官方文檔沒有提及超時之類的,就是直接連接.
對于第二個connect,timeout指定的超時時間,單位為ms,設(shè)置為0則為無限期等待.

參考鏈接

socket

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI