1、先看下API:
涉及到的類:Socket 、ServerSocket 、InetSocketAddress
Socket 類
java.lang.Object java.net.Socket
- 直接已知子類: SSLSocket
public class Socket extends Object
此類實現客戶端套接字(也可以就叫“套接字”)。套接字是兩台機器間通信的端點。
套接字的實際工作由 SocketImpl 類的實例執行。應用程序通過更改創建套接字實現的套接字工廠可以配置它自身,以創建適合本地防火牆的套接字。
ServerSocket 類
java.lang.Object java.net.ServerSocket
直接已知子類: SSLServerSocket
public class ServerSocket extends Object
此類實現服務器套接字。服務器套接字等待請求通過網絡傳入。它基於該請求執行某些操作,然后可能向請求者返回結果。
服務器套接字的實際工作由 SocketImpl 類的實例執行。應用程序可以更改創建套接字實現的套接字工廠來配置它自身,從而創建適合本地防火牆的套接字。
InetSocketAddress 類
java.lang.Object
java.net.SocketAddress
java.net.InetSocketAddress
- 所有已實現的接口: Serializable
public class InetSocketAddress extends SocketAddress
此類實現 IP 套接字地址(IP 地址 + 端口號)。它還可以是一個對(主機名 + 端口號),在此情況下,將嘗試解析主機名。如果解析失敗,則該地址將被視為未解析 地址,但是其在某些情形下仍然可以使用,比如通過代理連接。
它提供不可變對象,供套接字用於綁定、連接或用作返回值。
2、需求1:實現一個TCP Client,向服務器發送文本數據
TCPDemo.java---創建Socket服務
package com.Train; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.io.OutputStream; import org.omg.CORBA.portable.OutputStream; //TCP--------面向連接 /**客戶端-服務器模式 * 1、連接 * 2、發送數據 * 3、斷開連接 * */ //需求1:程序實現客戶端,給服務器發送文本數據
public class TCPDemo { public static void main(String[] args) throws Exception { /**方法一:創建客戶端的Socket服務-- 一創建Socket就連接目地服務器 * Socket sok = new Socket(InetAddress.getByName("192.168.1.150"), 2000); * */ /**方法二:==分步 * 1、創建客戶端的Socket服務 * 2、連接目地服務器 * 3、獲取通路中的輸出流,寫送數據 * 4、關閉Socket服務 * */ Socket sok = new Socket(); sok.connect(new InetSocketAddress(InetAddress.getByName("192.168.1.150"), 2000)); //連接服務器 //通路一建立,流就有了 //為了發送數據,要獲取Socket流中的輸出流 OutputStream outS = sok.getOutputStream(); outS.write("this is data".getBytes()); sok.close(); } }
服務器: 接收數據並顯示
3、需求2:實現一個TCP Server,接收客戶端的數據並打印,把接收到的數據發送回去
TCPDemo.java
package com.Train; import java.net.ServerSocket; import java.net.Socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; //TCP--------面向連接 /**客戶端-服務器模式 * 1、連接 * 2、發送數據 * 3、斷開連接 * */ //需求2:程序實現服務器 ,TCP server,監聽連接,連接,通過流讀取數據,發送數據 public class TCPDemo { public static void main(String[] args) throws Exception { /**ServerSocket服務======================= * */ //1、建立服務 ServerSocket svSok = new ServerSocket(9000); //2、阻塞監聽,並負責接受連接-------------返回值:Socket Socket sok = svSok.accept(); //3、已連接,獲取對方ip及端口,獲取通道的流管道讀取數據,發送數據 // 3.1 得到客戶端的流,使用輸入流進行讀取 ------> new BufferedReader(new InputStreamReader(sok.getInputStream())).readline() // 讀取數據 // 3.2 將讀取到的數據原文發送回去 System.out.println("【Receive from "+sok.getInetAddress().getHostAddress()+": "+sok.getPort()+"】"); BufferedReader brReader = new BufferedReader(new InputStreamReader(sok.getInputStream())); String recvStrs = brReader.readLine(); //阻塞讀--|--> System.out.println(recvStrs); //BufferedWriter brWriter = new BufferedWriter(new OutputStreamWriter(sok.getOutputStream())); //brWriter.write("received"); OutputStream outS = sok.getOutputStream(); outS.write(recvStrs.getBytes()); } }
<console>TCP Server:
TCP Client:



