客戶端socket
流程:
1、連接遠程主機
2、發送數據
3、接收數據
4、關閉流與socket連接
實例:
import java.io.*; import java.net.Socket; import java.util.Date; /** * Created by CLY on 2017/7/11. */ public class ClientSocket { public static void main(String[] arg){ int port = 233;//與之連接的服務端套接字的端口號 String host = "127.0.0.1";//與之連接的服務端套接字ip地址 Socket socket = null; try { //創建socket連接,即在該Socket構造函數返回之前,就會與遠程主機建立連接,如果未能連接,則會拋出異常。 socket = new Socket(host, port); //獲取輸出流,向服務器端發送當前時間 OutputStream outputStream = socket.getOutputStream(); Writer writer = new OutputStreamWriter(outputStream); String now_date = new Date().toString(); writer.write("客戶端當前時間為——"+now_date); writer.flush(); ////關閉客戶端的輸出流。相當於給流中加入一個結束標記-1.這個樣子服務器的輸入流的reaLine方法就會讀到一個-1,然后結束readLIne方法。 socket.shutdownOutput(); //獲取輸入流,並讀取服務器端的響應信息 InputStream inputStream= socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String server_info = null; while((server_info=br.readLine())!=null){ System.out.println("服務端傳過來的值:"+server_info); } } catch (IOException e) { e.printStackTrace(); } finally { //如果socket不為null,則釋放掉它 if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
服務端Socket
流程:
1、綁定端口
2、監聽入站數據
3、在綁定的端口上接受來自遠程機器的連接
4、接收數據
5、發送數據
6、關閉流與socket連接
實例:
import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by CLY on 2017/7/11. */ public class MyServerSocket { public static void main(String[] arg){ /** * 根據tcp協議可知,所謂套接字(socket)是指一個由“ip地址+端口”組成的組合。 * 而每一台主機的ip地址都是確定的,不需要我們來指定, * 所以構建服務器socket的第一步就是確定端口 */ try { int port = 233;//端口號 int queueLength = 50;//最大入站連接 InetAddress bindAddress = InetAddress.getByName("127.0.0.1");//只監聽該ip的指定端口 ExecutorService pool = Executors.newFixedThreadPool(50);//創建一個最大容量為50的線程池,為每一個入站連接分配一條線程。 //創建一個端口為“233”的服務器socket ServerSocket serverSocket = new ServerSocket(port); //創建一個端口為233的服務器socket,且隊列一次最多能保存50個入站連接 //ServerSocket serverSocket = new ServerSocket(port,queueLength); //假設一台主機有多個ip地址,則服務器socket會默認在所有ip地址的指定端口上監聽,但可以指定其只監聽指定ip的端口。 //ServerSocket serverSocket = new ServerSocket(port,queueLength,bindAddress); while (true){ //accept()調用會阻塞,會一直等到有客戶端連接到指定socket端口為止。 final Socket connection = serverSocket.accept(); //線程池中拿取一條線程來處理socket連接。然后主程序運行下一個循環,繼續等待下一個客戶端的訪問。 pool.execute(new Runnable() { public void run() { try { //從輸入流中讀取獲取客戶端傳過來的值 InputStream inputStream= connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String client_info = null; while((client_info=br.readLine())!=null){ System.out.println("客戶端傳過來的值:"+client_info); } //測試:將當前時間寫入流中返回給客戶端 Writer writer = new OutputStreamWriter(connection.getOutputStream()); String nowData = new Date().toString(); writer.write("服務端當前時間為——"+nowData); writer.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { //關閉socket連接 connection.close(); } catch (IOException e) { e.printStackTrace(); } } } }); } } catch (IOException e) { e.printStackTrace(); } } }