/*前置知識(服務端)1.首先要常見一個ServerSocket對象 服務端套接字,并且在服務端套接字里面確定需要使用的端口2.然后要創建一個Socket對象來接收ServerSocket的返回值。通常一個Socket對象對應一個客戶端/涉及到多個客戶端需要通過線程來解決3.現在客戶端和服務端已經通過socket鏈接了,然后就需要創建一個InputStream的輸入流來獲取socket所對應客戶端的流入內容4.然后很關鍵的一點:需要創建一個ByteArrayOutPutStream這樣的 字符數組的輸出流來在控制臺輸出內容5.創建一個緩沖的字節數組Byte[] 然后給定它的大小 比如10246.現在我們進入循環讀取客戶端傳進流的信息的時候了,因此需要調用接收傳入流的ips中的read方法7.然后將讀取到的內容放入到Byte[]數組中,然后通過ByteArrayOutputStream的write方法將Byte[]數組輸出在控制臺8.因為客戶端輸入的信息一般都是字符串 因此我們需要把baos這個ByteArrayOutputStream轉換成String9.我們得把創建對象 和把對對象賦值的部分都留在try-with-resources結構里面 這樣可以避免手動關閉對象對資源的占用*/
/*
前置知識(客戶端):
1.還是先把try-with-resources結構擺出來
2.因為我們是客戶端,希望輸出內容,我們就得先和服務端鏈接
3.我們創建一個Socket套接字,先給本地安排一個地址,然后端口得和服務端對上
比如我們是服務端ip為127.0.0.1 端口為8090 我們就得把這個套接字對準8090和127.0.0.1
4.接下來我們依然是要和服務端一樣依托io流來完成信息的傳遞
比如我們依然需要創建一個OutputStream對象,然后讓這個對象和Socket發生關聯 比如getOutputStream這個方法
5.我們在OutputStream這個對象和Socket產生關聯之后 就可以調用OutputStream來調用write方法來輸出文字了
6.我們要切記:我們只能在此輸入字節類型的文件 因此需要調用getByte().*/
/*前置知識(客戶端):1.還是先把try-with-resources結構擺出來2.因為我們是客戶端,希望輸出內容,我們就得先和服務端鏈接3.我們創建一個Socket套接字,先給本地安排一個地址,然后端口得和服務端對上比如我們是服務端ip為127.0.0.1 端口為8090 我們就得把這個套接字對準8090和127.0.0.14.接下來我們依然是要和服務端一樣依托io流來完成信息的傳遞比如我們依然需要創建一個OutputStream對象,然后讓這個對象和Socket發生關聯 比如getOutputStream這個方法5.我們在OutputStream這個對象和Socket產生關聯之后 就可以調用OutputStream來調用write方法來輸出文字了6.我們要切記:我們只能在此輸入字節類型的文件 因此需要調用getByte().*/import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class TCPClient {public static void main(String[] args) {String serverHost = "127.0.0.1";int serverPort = 8888;try {// 創建socket連接服務器Socket socket = new Socket(serverHost, serverPort);// 獲取輸入輸出流BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);while (true) {// 從控制臺讀取用戶輸入的消息System.out.print("請輸入要發送的消息:");String message = reader.readLine();// 發送消息到服務器writer.println(message);// 如果輸入的消息為"bye",則退出循環if (message.equals("bye")) {break;}// 從服務器接收消息BufferedReader serverReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String serverMessage = serverReader.readLine();System.out.println("服務器返回的消息: " + serverMessage);}// 關閉連接socket.close();} catch (IOException e) {e.printStackTrace();}}}
/*前置知識(服務端)1.首先要常見一個ServerSocket對象 服務端套接字,并且在服務端套接字里面確定需要使用的端口2.然后要創建一個Socket對象來接收ServerSocket的返回值。通常一個Socket對象對應一個客戶端/涉及到多個客戶端需要通過線程來解決3.現在客戶端和服務端已經通過socket鏈接了,然后就需要創建一個InputStream的輸入流來獲取socket所對應客戶端的流入內容4.然后很關鍵的一點:需要創建一個ByteArrayOutPutStream這樣的 字符數組的輸出流來在控制臺輸出內容5.創建一個緩沖的字節數組Byte[] 然后給定它的大小 比如10246.現在我們進入循環讀取客戶端傳進流的信息的時候了,因此需要調用接收傳入流的ips中的read方法7.然后將讀取到的內容放入到Byte[]數組中,然后通過ByteArrayOutputStream的write方法將Byte[]數組輸出在控制臺8.因為客戶端輸入的信息一般都是字符串 因此我們需要把baos這個ByteArrayOutputStream轉換成String9.我們得把創建對象 和把對對象賦值的部分都留在try-with-resources結構里面 這樣可以避免手動關閉對象對資源的占用*/import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class TCPServer {public static void main(String[] args) {int serverPort = 8888;try {// 創建ServerSocket監聽指定端口ServerSocket serverSocket = new ServerSocket(serverPort);System.out.println("等待客戶端連接...");// 等待客戶端連接Socket clientSocket = serverSocket.accept();System.out.println("客戶端連接成功!");// 獲取輸入輸出流BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);while (true) {// 接收客戶端發送的消息String clientMessage = reader.readLine();// 如果客戶端發送的消息為"bye",則退出循環if (clientMessage.equals("bye")) {break;}System.out.println("接收到的消息: " + clientMessage);// 發送消息給客戶端writer.println("已接收到消息:" + clientMessage);}// 關閉連接clientSocket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}