Socket簡介
Socket是兩臺主機之間的一個連接。它可以完成7個基本操作:
- 連接遠程機器
- 發送數據
- 接收數據
- 關閉連接
- 綁定端口
- 監聽入站數據
- 在綁定端口上接受來自遠程機器的連接
Socket通信流程
實例
TCP實現
- 服務端代碼
public class TcpServer {
public static void main(String[] args) throws Exception {
// 創建socket 並將端口綁定在7000端口
ServerSocket serverSocket = new ServerSocket(7000);
while (true){
//監聽7000 端口,直至客戶端返回連接信息後才返回
Socket socket = serverSocket.accept();
new LengthCalculator(socket).start();
}
}
}
public class LengthCalculator extends Thread {
private Socket socket;
public LengthCalculator(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//獲取socket輸出流
OutputStream os = socket.getOutputStream();
//獲取socket輸入流
InputStream is = socket.getInputStream();
int ch = 0;
// 將接收流的byte數組轉換成字符串,這裏獲取的內容是客戶端發來的字符串,ch讀取字符串的長度
byte[] buff = new byte[1024];
ch = is.read(buff);
String content = new String(buff, 0, ch);
System.out.println(content);
//輸出流寫入字符串的長度,發送給客戶端
os.write(String.valueOf(content.length()).getBytes());
//關閉輸入輸出流以及socket
is.close();
os.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
super.run();
}
}
- 客戶端代碼
public class TcpClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 7000);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
os.write(new String("hello world").getBytes());
int ch = 0;
byte[] buff = new byte[1024];
ch = is.read(buff);
String content = new String(buff, 0, ch);
System.out.println(content);
is.close();
os.close();
socket.close();
}
}
UDP實現效果
- UDP服務端
public class UdpServer {
public static void main(String[] args) throws Exception {
// 服務端接收客戶端發送的數據報
DatagramSocket socket = new DatagramSocket(7000);
byte[] buff = new byte[1024];
// 接收客戶端發送過來的內,並將其內容封裝進 DatagramPacket對象中
DatagramPacket packet = new DatagramPacket(buff, buff.length);
socket.receive(packet);
byte[] data = packet.getData();
// 將數據從二進制轉換成字符串形式
String content = new String(data, 0, packet.getLength());
System.out.println(content);
// 將要發送給客戶端的數據轉換成二進制
byte[] sendContent = String.valueOf(content.length()).getBytes();
// 從DatagramPacket中獲取數據的來源地和端口號
DatagramPacket packetToClient = new DatagramPacket(sendContent, sendContent.length,
packet.getAddress(), packet.getPort());
// 發送數據給客戶端
socket.send(packetToClient);
}
}
- UDP客戶端
public class UdpClient {
public static void main(String[] args) throws Exception {
// 客戶端發送數據報給服務端
DatagramSocket socket = new DatagramSocket();
// 發送給服務器的數據
byte[] buf = "Hello World".getBytes();
// 將IP地址封裝成InetAddress對象
InetAddress address = InetAddress.getByName("127.0.0.1");
// 將要發送給服務端的數據封裝成DatagramPacket對象,填入Ip地址和端口號
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 7000);
//發送數據給服務端
socket.send(packet);
// 客戶端接收服務端發送來的數據報
byte[] data = new byte[100];
//創建DatagramPacket 對象用來儲存服務端發送過來的數據
DatagramPacket receivePacket = new DatagramPacket(data, data.length);
socket.receive(receivePacket);
String content = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println(content);
}
}
- 效果圖