tcp是一個(gè)可靠的協(xié)議,面向連接的協(xié)議,實(shí)現(xiàn)tcp程序,需要編寫服務(wù)器端和客戶端
ServerSocket:此類實(shí)現(xiàn)服務(wù)器套接字
Socket:此類實(shí)現(xiàn)客戶端套接字(也可以就叫套接字)
Socket是網(wǎng)絡(luò)驅(qū)動(dòng)層提供給應(yīng)用程序編程的接口和一種機(jī)制
單服務(wù)器和單用戶端通信
示例程序:
服務(wù)器端代碼:
//服務(wù)器端:先讀再寫
public class EchoServerDemo {
public static void main(String[] args) {
//step1:創(chuàng)建一個(gè)服務(wù)器端的Socket(91024-65535)
try {
ServerSocket server = new ServerSocket(6666);
System.out.println("服務(wù)器已啟動(dòng),正在等待客戶端連接");
//step2:等待客戶端連接,造成阻塞,如果沒(méi)有客戶端連進(jìn)來(lái)就一直等待
//如果有客戶端連接成功,立即返回一個(gè)Socket對(duì)象
Socket socket = server.accept();
System.out.println("客戶端連接成功"+server.getInetAddress().getHostAddress());
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//step3:通過(guò)輸入流讀取網(wǎng)絡(luò)數(shù)據(jù),如果沒(méi)有數(shù)據(jù),會(huì)造成阻塞
String info = br.readLine();
System.out.println(info);
//step4:獲取輸出流,向客戶端返回消息
PrintStream ps = new PrintStream(
new BufferedOutputStream(socket.getOutputStream()));
ps.println("echo:"+info);
ps.flush();
//step5:關(guān)閉
ps.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端代碼:
public class EchoClientDemo {
public static void main(String[] args) {
//step1:創(chuàng)建一個(gè)Socket對(duì)象
try {
Socket socket = new Socket("localhost",6666);
//step2:獲取socket的輸入輸出流
PrintStream ps = new PrintStream(
new BufferedOutputStream(socket.getOutputStream())
);
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
ps.println("hello");
ps.flush();
//讀取服務(wù)器端返回的數(shù)據(jù)
String info = br.readLine();
System.out.println(info);
ps.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
運(yùn)行效果:

在運(yùn)行客戶端:

此時(shí)服務(wù)器端:

單服務(wù)器和多客戶端通信
需要加入多線程的處理機(jī)制