image.png
TCP實現(xiàn)Socket
服務端
public class TCPServer {
public static void main(String[] args) throws Exception {
//創(chuàng)建socket,并將socket綁定到65000端口
ServerSocket ss = new ServerSocket(65000);
//死循環(huán),使得socket一直等待并處理客戶端發(fā)送過來的請求
while (true) {
//監(jiān)聽65000端口,直到客戶端返回連接信息后才返回
Socket socket = ss.accept();
//獲取客戶端的請求信息后抗蠢,執(zhí)行相關業(yè)務邏輯
new LengthCalculator(socket).start();
}
}
}
線程類
public class LengthCalculator extends Thread {
//以socket為成員變量
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[] buff = new byte[1024];
//buff主要用來讀取輸入的內容濒憋,存成byte數(shù)組宵溅,ch主要用來獲取讀取數(shù)組的長度
ch = is.read(buff);
//將接收流的byte數(shù)組轉換成字符串髓介,這里獲取的內容是客戶端發(fā)送過來的字符串參數(shù)
String content = new String(buff, 0, ch);
System.out.println(content);
//往輸出流里寫入獲得的字符串的長度,回發(fā)給客戶端
os.write(String.valueOf(content.length()).getBytes());
//不要忘記關閉輸入輸出流以及socket
is.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端
public class TCPClient {
public static void main(String[] args) throws Exception {
//創(chuàng)建socket,并指定連接的是本機的端口號為65000的服務器socket
Socket socket = new Socket("127.0.0.1", 65000);
//獲取輸出流
OutputStream os = socket.getOutputStream();
//獲取輸入流
InputStream is = socket.getInputStream();
//將要傳遞給server的字符串參數(shù)轉換成byte數(shù)組剃法,并將數(shù)組寫入到輸出流中
os.write(new String("hello world").getBytes());
int ch = 0;
byte[] buff = new byte[1024];
//buff主要用來讀取輸入的內容,存成byte數(shù)組路鹰,ch主要用來獲取讀取數(shù)組的長度
ch = is.read(buff);
//將接收流的byte數(shù)組轉換成字符串贷洲,這里是從服務端回發(fā)回來的字符串參數(shù)的長度
String content = new String(buff, 0, ch);
System.out.println(content);
//不要忘記關閉輸入輸出流以及socket
is.close();
os.close();
socket.close();
}
}
UDP實現(xiàn)socket
服務端
public class UDPServer {
public static void main(String[] args) throws Exception {
// 服務端接受客戶端發(fā)送的數(shù)據(jù)報
DatagramSocket socket = new DatagramSocket(65001); //監(jiān)聽的端口號
byte[] buff = new byte[100]; //存儲從客戶端接受到的內容
DatagramPacket packet = new DatagramPacket(buff, buff.length);
//接受客戶端發(fā)送過來的內容收厨,并將內容封裝進DatagramPacket對象中
socket.receive(packet);
byte[] data = packet.getData(); //從DatagramPacket對象中獲取到真正存儲的數(shù)據(jù)
//將數(shù)據(jù)從二進制轉換成字符串形式
String content = new String(data, 0, packet.getLength());
System.out.println(content);
//將要發(fā)送給客戶端的數(shù)據(jù)轉換成二進制
byte[] sendedContent = String.valueOf(content.length()).getBytes();
// 服務端給客戶端發(fā)送數(shù)據(jù)報
//從DatagramPacket對象中獲取到數(shù)據(jù)的來源地址與端口號
DatagramPacket packetToClient = new DatagramPacket(sendedContent,
sendedContent.length, packet.getAddress(), packet.getPort());
socket.send(packetToClient); //發(fā)送數(shù)據(jù)給客戶端
}
}
客戶端
public class UDPClient {
public static void main(String[] args) throws Exception {
// 客戶端發(fā)數(shù)據(jù)報給服務端
DatagramSocket socket = new DatagramSocket();
// 要發(fā)送給服務端的數(shù)據(jù)
byte[] buf = "Hello World".getBytes();
// 將IP地址封裝成InetAddress對象
InetAddress address = InetAddress.getByName("127.0.0.1");
// 將要發(fā)送給服務端的數(shù)據(jù)封裝成DatagramPacket對象 需要填寫上ip地址與端口號
DatagramPacket packet = new DatagramPacket(buf, buf.length, address,
65001);
// 發(fā)送數(shù)據(jù)給服務端
socket.send(packet);
// 客戶端接受服務端發(fā)送過來的數(shù)據(jù)報
byte[] data = new byte[100];
// 創(chuàng)建DatagramPacket對象用來存儲服務端發(fā)送過來的數(shù)據(jù)
DatagramPacket receivedPacket = new DatagramPacket(data, data.length);
// 將接受到的數(shù)據(jù)存儲到DatagramPacket對象中
socket.receive(receivedPacket);
// 將服務器端發(fā)送過來的數(shù)據(jù)取出來并打印到控制臺
String content = new String(receivedPacket.getData(), 0,
receivedPacket.getLength());
System.out.println(content);
}
}