1. 程式人生 > >Java Socket通訊 客戶端與伺服器端的連線 和資訊傳輸

Java Socket通訊 客戶端與伺服器端的連線 和資訊傳輸

一.建立客戶端和伺服器端的連線。

方法分2步:

1.在客戶端建立Socket物件,用來發送連線請求

2.在伺服器端穿件ServerSocket物件,用來接收請求。

//客戶端
public class socket1 {
	Socket socket;
	public static void main(String[] args) {
		new socket1().setUpInternetWoring();
	}
	
	void setUpInternetWoring(){
		try {
			//建立Socket物件設定要連線的IP地址和客戶端的埠號
			socket = new  Socket("127.0.0.1",888);
			
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				socket.close();	//要關閉
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}


//伺服器端
public class server1{
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(888);//建立監聽物件sever 監聽埠號888
			Socket LinkSocket = server.accept(); //接收請求資訊 並返回請求物件
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
		}
		
	}
}


二.實現客戶端和伺服器端的通訊。

方法很簡單:

對客戶端而言,一方面要接收資訊,另一方面要傳送資訊。

對伺服器端而言,和客戶端是一樣的。

為了實現這兩個功能,用到了I/O流。使用socket是兩個函式:

1.getInputStream();從建立的通道中讀取資訊

2.getOutputStream();向建立的通道中寫入資訊

具體方法是:

1:建立BufferedReader的物件來儲存通道中讀取的資訊

2:建立PrintWriter的物件,通過println()方法向通道中寫入資訊

客戶端通訊虛擬碼:

Socket socket;
BufferedReader reader;
PrintWriter writer;


void setUpInternetWoring(){
		try {
			//建立Socket物件設定要連線的IP地址和客戶端的埠號
			socket = new  Socket("127.0.0.1",888);
			System.out.println("連線成功");
			
			//讀資訊
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String message = null;
			while((message = reader.readLine())!=null){
				System.out.println(message);//讀取到的資訊
			}
			//寫資訊  伺服器端通過reader讀到的資訊就是這裡傳送的資訊
			writer = new PrintWriter(socket.getOutputStream());
			writer.println("要傳送的資訊,怎麼輸入的都行");
			writer.flush();//重新整理,讓伺服器端馬上接收到資訊
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				//用完要關閉,避免資源浪費
				reader.close();
				writer.close();
				socket.close();	//要關閉
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
其實伺服器端和客戶端程式碼是一樣的。
伺服器端通訊虛擬碼:

BufferedReader reader;
PrintWriter writer;
Socket LinkSocket;

void setUpNetworking(){
		try {
			ServerSocket server = new ServerSocket(888);//建立監聽物件sever 監聽埠號888
			LinkSocket = server.accept(); //接收請求資訊 並返回請求物件
			//讀資訊
			reader = new BufferedReader(new InputStreamReader(LinkSocket.getInputStream()));
			String message = null;
			while((message=reader.readLine())!=null){
				System.out.println(message);
			}
			//寫資訊
			writer = new PrintWriter(LinkSocket.getOutputStream());
			writer.println("要寫入 的資訊");
			writer.flush();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			try {
				reader.close();
				writer.close();
				LinkSocket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}