基於TCP實現簡單的客戶端服務端的消息傳遞

其實網絡編程時很重要的,當初我也沒好好去學,現在也因爲一直沒接觸到,也沒想着去看,今天無聊,就閒着看了看。


首先看下通訊的流程。




接下來我們來簡單實現一下:

先看圖有個基本的瞭解:




接下來我們就用兩個類簡單模擬一下客戶端與服務端:

先看客戶端類:

Client:

package com.socket.demo;

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;

/**
 * 客戶端
 * @author lolli
 *
 */
public class Client {

	public static void main(String[] args) {
		
		try {
			//  實例化一個Socket,請求8888端口
			Socket socket = new Socket("localhost", 8888);
			
			// 獲取一個輸出流像服務端發送消息
			
			OutputStream outputStream = socket.getOutputStream();
			
			PrintWriter out = new PrintWriter(outputStream);
			
			out.write("用戶名:admin; 密碼:123456");
			// 刷新緩存 ,發送請求
			out.flush();
			
			socket.shutdownOutput();
			
			
			// 獲取一個輸入流,接受服務端的響應
			
			InputStream in = socket.getInputStream();
			// 轉換成字符流
			InputStreamReader inputStreamReader = new InputStreamReader(in);
			// 放入緩衝流
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			
			// 獲取客戶端請求的數據
			String str = "";
			while((str = bufferedReader.readLine())!=null){
				// 打印客戶端請求的數據
				System.out.println("我是客戶端,服務端說: " + str);
			}
			
			socket.shutdownInput();
			
			// 關閉流
			out.close();
			outputStream.close();
			socket.close();
			
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}


再看看服務端:

Server:

package com.socket.demo;

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;

/**
 * 服務端
 * @author lolli
 *
 */
public class Server {

	public static void main(String[] args) {
		
		try {
			// 實例化一個ServerSocket,監聽8888端口
			ServerSocket serverSocket = new ServerSocket(8888);
			System.out.println("*****  啓動服務器,等待客戶端的連接請求  ******");
			Socket socket = serverSocket.accept();
			// 接收輸入流(字節流)
			InputStream in = socket.getInputStream();
			// 轉換成字符流
			InputStreamReader inputStreamReader = new InputStreamReader(in);
			// 放入緩衝流
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			
			// 獲取客戶端請求的數據
			String str = "";
			String data = "";
			while((str = bufferedReader.readLine())!=null){
				// 打印客戶端請求的數據
				System.out.println("我是服務端,客戶端說: " + str);
				data = str;
			}
			
			System.out.println(str);
			// 接收到客戶端請求的數據後相應客戶端
			OutputStream outputStream = socket.getOutputStream();
			PrintWriter out = new PrintWriter(outputStream);
			out.write("接收到了客戶端傳遞的數據,數據爲:‘" + data + "’");
			out.flush();
			
			socket.shutdownInput();
			socket.shutdownOutput();
			//  關閉流
			bufferedReader.close();
			inputStreamReader.close();
			in.close();
			socket.close();
			serverSocket.close();
			out.close();
			outputStream.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

再看看控制檯的簡單打印:

先看服務端的控制檯:



在看看客戶端的控制檯:






這裏值得注意的是,我們必須先啓動服務端,客戶端才能去請求。先啓動服務端,然後通過serverSocket.accept();來監聽客戶端的請求




發佈了53 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章