JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息
生活随笔
收集整理的這篇文章主要介紹了
JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
客戶端代碼:
package com.lcx.socket;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /*** * @author*/ public class SocketClient {public static void main(String[] args) {try {/*** 回想下流的讀入寫出概念:* 如果是磁盤IO,那么何為讀入?將磁盤內容讀入到內存中。何為寫出?將內存的內容寫出到磁盤中持久化。* 如果是網絡IO,那么何為讀入?將網絡傳輸的內容讀入到內存中。何為寫出?將內存的內容寫出到網絡傳輸中。* 以InputStream/Reader結尾的一般是 讀入字節/字符流。* 以OutputStream/Writer結尾的一般是 寫出字節/字符流。* 主要步驟:* 1、客戶端根據服務器端IP地址和端口號獲取socket對象。* 2、根據socket對象獲取讀入流,獲取服務端反饋的內容。將字節流轉換成字符流,然后處理信息。* 3、根據socket對象獲取寫出流,用于想服務端發送內容。同樣將字節流轉換成字符流,然后處理信息。* 4、關流、關socket* 用單線程實現客戶端和服務端簡單的消費推送* 隨后實現客戶端和服務端進行通話*///1、獲取socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 6666);//2、獲取讀入流BufferedReader acceptServerInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));/*** 網上字符流的寫出大都用的PrintWriter,我想字符流讀入用的 BufferedReader那么字符流的寫出也可以用BufferedWriter* 實際上是可以,PrintWriter.println可以直接結束本行開始下一個文本行,而BufferedWriter必須BufferedWriter.newLine* 手動結束本行開始下一行。write方法調用后,再其后必須調用newLine實現該文本行的結束,否則BufferedReader讀取不到* *///3、獲取寫出流,BufferedWriter實現BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("客戶端:我是客戶端");bufferedWriter.newLine();bufferedWriter.write("客戶端:我是客戶端的王五");bufferedWriter.newLine();bufferedWriter.write("客戶端:服務端的張三在嗎?");bufferedWriter.newLine();bufferedWriter.flush();//3、獲取寫出流,PrintWriter實現PrintWriter sendToServerInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//PrintWriter.print 打印,PrintWriter.println 打印后終止該行,此行為一個文本行sendToServerInfo.println("客戶端:我是客戶端");sendToServerInfo.println("客戶端:我是客戶端的王五");sendToServerInfo.println("客戶端:服務端的張三在嗎?");sendToServerInfo.flush();//讀取客戶端反饋的信息while(acceptServerInfo.ready()){String line = acceptServerInfo.readLine();System.out.println(line);}sendToServerInfo.close();bufferedWriter.close();acceptServerInfo.close();socket.close(); } catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}} 服務端代碼: package com.lcx.socket;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket;public class SocketServer {public static void main(String[] args) {/*** 服務端* 1、根據端口號(并不需要IP,本機就是服務端)創建ServerSocket對象* 2、根據ServerSocket對象accept方法創建Socket對象* 3、同客服端一樣,根據socket對象獲取讀入流,獲取服務端反饋的內容。將字節流轉換成字符流,然后處理信息。* 4、根據socket對象獲取寫出流,用于想服務端發送內容。同樣將字節流轉換成字符流,然后處理信息。* 5、關流、關socket*/try {//1、創建ServerSocket對象ServerSocket serverSocket = new ServerSocket(6666);//2、根據ServerSocket對象創建Socket對象,等待客戶端連接Socket socket = serverSocket.accept();//3、接受客戶端信息BufferedReader acceptClientInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));//4、給客戶端信息PrintWriter sendToClientInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//讀取客戶端發來的信息while(acceptClientInfo.ready()){//讀取一個文本行String info = acceptClientInfo.readLine();System.out.println(info);}//給客戶端發信息sendToClientInfo.println("服務端:我是服務端的張三");sendToClientInfo.println("服務端:你是客戶端的李四嗎?");sendToClientInfo.flush();sendToClientInfo.close();acceptClientInfo.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}簡單推送消息結果截圖:
服務端和客戶端進行消息的相互推送
客服端代碼
package com.lcx.socket;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; /*** * @author*/ public class SocketClient2 {public static void main(String[] args) {try {/*** 回想下流的讀入寫出概念:* 如果是磁盤IO,那么何為讀入?將磁盤內容讀入到內存中。何為寫出?將內存的內容寫出到磁盤中持久化。* 如果是網絡IO,那么何為讀入?將網絡傳輸的內容讀入到內存中。何為寫出?將內存的內容寫出到網絡傳輸中。* 以InputStream/Reader結尾的一般是 讀入字節/字符流。* 以OutputStream/Writer結尾的一般是 寫出字節/字符流。* 主要步驟:* 1、客戶端根據服務器端IP地址和端口號獲取socket對象。* 2、根據socket對象獲取讀入流,獲取服務端反饋的內容。將字節流轉換成字符流,然后處理信息。* 3、根據socket對象獲取寫出流,用于想服務端發送內容。同樣將字節流轉換成字符流,然后處理信息。* 4、關流、關socket* 用單線程實現客戶端和服務端簡單的消費推送* 隨后實現客戶端和服務端進行通話*/System.out.println("-------------客戶端界面------------------");//1、獲取socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 6666);//2、獲取讀入流BufferedReader acceptServerInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));//3、獲取寫出流PrintWriter sendToServerInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//從控制臺,輸入消息和服務端對話,輸入流 // BufferedReader inputInfo = new BufferedReader(new InputStreamReader(System.in));Scanner inputInfo = new Scanner(System.in);while(true){//發送消息 // String str = inputInfo.readLine();String str = inputInfo.nextLine();if("end".equals(str)){break;}System.out.println("客戶端:"+str);sendToServerInfo.println("客戶端:"+str);sendToServerInfo.flush();//接受消息String acStr = acceptServerInfo.readLine();System.out.println(acStr);}sendToServerInfo.close();acceptServerInfo.close();socket.close(); } catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}} 服務端代碼package com.lcx.socket;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;public class SocketServer2 {public static void main(String[] args) {/*** 服務端* 1、根據端口號(并不需要IP,本機就是服務端)創建ServerSocket對象* 2、根據ServerSocket對象accept方法創建Socket對象* 3、同客服端一樣,根據socket對象獲取讀入流,獲取服務端反饋的內容。將字節流轉換成字符流,然后處理信息。* 4、根據socket對象獲取寫出流,用于想服務端發送內容。同樣將字節流轉換成字符流,然后處理信息。* 5、關流、關socket*/try {System.out.println("-------------服務端界面------------------");//1、創建ServerSocket對象ServerSocket serverSocket = new ServerSocket(6666);//2、根據ServerSocket對象創建Socket對象,等待客戶端連接Socket socket = serverSocket.accept();//3、獲取讀入流BufferedReader acceptClientInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));//4、獲取寫出流PrintWriter sendToClientInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); // BufferedReader inputInfo = new BufferedReader(new InputStreamReader(System.in));Scanner inputInfo = new Scanner(System.in);while(true){//讀取客戶端信息String info = acceptClientInfo.readLine();System.out.println(info); // String str = inputInfo.readLine();String str = inputInfo.nextLine();if("end".equals(str)){break;}//給客戶端發信息System.out.println("服務端:"+str);sendToClientInfo.println("服務端:"+str);sendToClientInfo.flush();}sendToClientInfo.close();acceptClientInfo.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}} 對話截圖:
總結
以上是生活随笔為你收集整理的JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA 启动时,报“淇℃伅”的字符
- 下一篇: Delphi:第一个hello worl