1. 程式人生 > >JAVA中Socket服務端和客戶端網路通訊簡單案例

JAVA中Socket服務端和客戶端網路通訊簡單案例

一. 簡單介紹下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>