JAVA中Socket服務端和客戶端網路通訊簡單案例
阿新 • • 發佈:2018-12-10
一. 簡單介紹下Socket的用途:
1.Java最初是作為網路程式語言出現的,其對網路提供了高度的支援,使得客戶端和伺服器的溝通變成了現實,而在網路程式設計中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相關的技術
2.IP地址+埠號組成了所謂的Socket,Socket是網路上執行的程式之間雙向通訊鏈路的終結點,是TCP和UDP的基礎
3.Socket套接字:網路上具有唯一標識的IP地址和埠組合在一起才能構成唯一能識別的識別符號套接字。
Socket原理機制:
通訊的兩端都有Socket
網路通訊其實就是Socket間的通訊
資料在兩個Socket間通過IO傳輸
注:需要導一些jar包
新建一個日誌檔案
專案整體架構
二.下面上程式碼:
1.服務端
package socket_work; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.util.logging.Logger; import util.Log4jBean; /** * 服務端 * @author syp * */ public class Server2 extends Thread { public void run() { for(int i=0;i<3;i++) { try { this.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) throws IOException { Log4jBean.logger.info("伺服器正在啟動,請稍後。。。"); Server2 s=new Server2(); s.run(); //建立一個伺服器端socket,指定繫結的埠號,並監聽此埠 ServerSocket serverSocket = new ServerSocket(8080); //呼叫accept()方法開始監聽,等待客戶端的連線 Log4jBean.logger.info("====================================================="); Log4jBean.logger.info("============伺服器已啟動,等待客戶端的連線==============="); Log4jBean.logger.info("====================================================="); Socket socket = serverSocket.accept(); //獲取輸入流,並讀取客戶端資訊 InputStream inp = socket.getInputStream(); //把位元組流轉換成字元流 InputStreamReader isr = new InputStreamReader(inp); //為字元流增加緩衝區 BufferedReader bfr = new BufferedReader(isr); String clientinfo = null; int i=0; while((clientinfo=bfr.readLine())!=null){//迴圈讀取資料 System.out.println("此處為伺服器 \n " + " 正在獲取客戶端對話 \n" + " 客戶端請求資訊為"+clientinfo); String[ ] strs = clientinfo.split(";"); } socket.shutdownInput();//關閉輸入流 //向客戶端傳遞的資訊 OutputStream ots = socket.getOutputStream(); PrintWriter pw = new PrintWriter(ots); pw.write("==================歡迎登陸====================="); pw.flush(); //關閉資源 Log4jBean.logger.info("準備關閉資源"); pw.close(); ots.close(); bfr.close(); isr.close(); inp.close(); socket.close(); serverSocket.close(); } }
2.客戶端
package socket_work; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import util.Log4jBean; /** * 客戶端 * @author syp * */ public class Client { public static void main(String[] args) { try { //建立一個客戶端socket, Socket socket = new Socket("localhost",8080); //向伺服器端傳遞資訊 OutputStream ots = socket.getOutputStream(); PrintWriter pw = new PrintWriter(ots); Scanner input=new Scanner(System.in); Log4jBean.logger.info("=============================================================="); Log4jBean.logger.info("===================歡迎進入登陸介面============================="); Log4jBean.logger.info("=============================================================="); Log4jBean.logger.info("請輸入您的使用者名稱"); String username=input.nextLine(); Log4jBean.logger.info("請輸入密碼"); String password=input.nextLine(); pw.write(username+";"+password); pw.flush(); Log4jBean.logger.info("開始關閉輸出流"); //關閉輸出流 socket.shutdownOutput(); //獲取伺服器端傳遞的資料 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String info = null; while((info=br.readLine())!=null){ Log4jBean.logger.info(" 此處為客戶端 \n" + " 正在等待伺服器響應 \n" + " 伺服器響應:"+info+" "); } //關閉資源 Log4jBean.logger.info("準備關閉資源"); br.close(); isr.close(); is.close(); pw.close(); ots.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
3.其中需要的一些工具類,如日誌列印類及日誌的配置檔案
①.Log4jBean類
package util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jBean {
public static Logger logger = LogManager.getLogger(Log4jBean.class
.getName());
}
②.日誌配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<properties>
<property name="logPath">log</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%F]-[%p]-%L %m%n " />
</Console>
<RollingFile name="RollingFile" filename="${logPath}/log.log"
filepattern="${logPath}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%F]-[%p]-%L %m%n " />
<Policies>
<SizeBasedTriggeringPolicy size="10240kb"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<!-- <AppenderRef ref="LogFile" /> -->
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>