標籤:ati 分配 server 接收 void 就會 tcp協議 stream 建立
用戶端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(); } }}
java通訊端(socket)執行個體