許多學(xué)習(xí)java SE的小伙伴可能會羨慕學(xué)java web的小伙伴——他們能進(jìn)行前后端交互,看著就很厲害的樣子。而學(xué)會json的小伙伴可能會嘗試使用類似web的方法通過json來進(jìn)行數(shù)據(jù)傳輸。但實際上,java提供了一種更加高效的程序間傳輸數(shù)據(jù)的方式,這就是socket。接下來的文章,小編將用一個socket的實際項目,來讓各位小伙伴了解什么是socket網(wǎng)絡(luò)編程。
什么是socket?
socket,中文翻譯為套接字。它是一種對網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程(或者相同主機(jī)的不同應(yīng)用進(jìn)程)之間進(jìn)行雙向通信的端點的抽象。實際上就是兩個網(wǎng)絡(luò)各種通信連接中的端點。它的作用就是完成應(yīng)用間的數(shù)據(jù)傳輸。
套接字技術(shù)簡單的來講就是通過socket,將兩個應(yīng)用進(jìn)行連接,連接之后就能進(jìn)行數(shù)據(jù)傳輸了。socket只是實現(xiàn)連接的方法。
小編認(rèn)為套接字這個翻譯并不能直接反映出這門技術(shù)的特點(過于生澀),socket可以被翻譯為插座,而實際上套接字技術(shù)更像是軟件上的“插座”和“插頭”。漢語中的套接,是一種水管對接的技術(shù),使用一個套接管將兩端的水管連接起來,這種技術(shù)就叫套接,所以是不是能理解什么是套接字了呢?
更多關(guān)于socket協(xié)議的介紹,可以前往websocket協(xié)議進(jìn)行查看。
怎么使用socket?
不同語言實現(xiàn)套接字的方式不同,java有專門實現(xiàn)套接字的包。只需要?import
? 相應(yīng)的包,就可以進(jìn)行套接字編程。
創(chuàng)建socket連接后可以通過?getInputStream()
?和?getOutputStream()
?的方法來獲取和發(fā)送socket之間傳輸?shù)臄?shù)據(jù)。
接下來就用一個實例代碼來介紹一下怎么使用socket吧!
socket項目實戰(zhàn)
server.java
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args){
try {
ServerSocket serverSocket = new ServerSocket(8888);
//在8888端口上監(jiān)聽,看是否有連接請求過來
System.out.println("開啟服務(wù)端");
Socket accept = serverSocket.accept();
//獲取socket連接
System.out.println("有連接過來"+accept);
Thread thread1 = new Thread(){//使用多線程來進(jìn)行收發(fā),線程1用來接收消息
@Override
public void run() {
try {
InputStream inputStream = accept.getInputStream();//獲取socket輸入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
//把輸入流封裝在DataInputStream
while (true){
String msg = dataInputStream.readUTF();//使用readUTF讀取字符串
System.out.println("監(jiān)聽客戶端消息: "+msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread thread2 = new Thread(){//線程2用來發(fā)送消息
@Override
public void run() {
try {
OutputStream outputStream = accept.getOutputStream();
//打開輸出流
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
//把輸出流封裝在DataOutputStream中
Scanner scanner = new Scanner(System.in);
while (true){
String strServer = scanner.next();
dataOutputStream.writeUTF(strServer);//使用writeUTF發(fā)送字符串
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread1.start();
thread2.start();
thread1.join();
System.out.println("服務(wù)器關(guān)閉");
accept.close();//關(guān)閉單個socket連接
serverSocket.close(); //關(guān)閉這個socket 服務(wù)器
} catch (Exception e) {
System.out.println("斷開連接");
}
}
}
client.java
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
String host = "127.0.0.1";//目標(biāo)電腦的ip地址,這里的地址是本機(jī)地址
int port = 8888;//目標(biāo)電腦的端口
boolean flag = true;
try {
Socket socket = new Socket(host, port);//創(chuàng)建目標(biāo)連接,傳入ip地址和端口號
System.out.println("開啟客戶端");
Thread thread1 = new Thread() {//使用多線程方法來實行收發(fā),線程1負(fù)責(zé)接收信息
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();//獲取socket輸入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
//把輸入流封裝在DataInputStream
while (true) {
String msg = dataInputStream.readUTF();//使用readUTF讀取字符串
System.out.println("接收服務(wù)端消息: " + msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread thread2 = new Thread() {//線程2用來發(fā)送消息
@Override
public void run() {
try {
OutputStream outputStream = socket.getOutputStream();
//打開輸出流
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
//把輸出流封裝在DataOutputStream中
Scanner scanner = new Scanner(System.in);
while (true) {
String str = scanner.next();
dataOutputStream.writeUTF(str);//使用writeUTF發(fā)送字符串
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread1.start();
thread2.start();
thread1.join();
System.out.println("客戶端關(guān)閉");
socket.close();//關(guān)閉這個socket
} catch (Exception e) {
System.out.println("斷開連接");
}
}
}
上述代碼涉及到多線程的知識,如果對多線程有所疑問,可以前往java多線程編程進(jìn)行學(xué)習(xí)。如果理解不了socket代碼,也可以前往java網(wǎng)絡(luò)編程進(jìn)行學(xué)習(xí)。
小結(jié)
以上就是Java實現(xiàn)socket通信的方法。掌握socket通信對于java的多端開發(fā)(比如服務(wù)器客戶端,或者兩個點對點應(yīng)用)是十分重要的,各位小伙伴一定要好好學(xué)習(xí)啊。