天天看點

socket程式設計一

socket是基于TCP/IP協定的一種用戶端與伺服器端通信交流的一種重要的手段:

下面實作的是一個用戶端,對伺服器發送請求,用戶端收到服務端的回複!

第一步:建立一個java Project  如下圖所示:

socket程式設計一

第二步:伺服器端的代碼如下:

package com.socket.server;

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 lfc 對于這個用戶端以及服務端,運作的時候,必須先服務端開始運作起來,開始監聽用戶端的程式請求
 * 現在傳遞的隻是一個字元串
 */
public class SocketServer {

	public static void main(String[] args) {
		
		System.out.println("伺服器端準備好監聽用戶端的請求了。。。");
		try {
			// 1:建立一個服務端的ServerScoket,綁定端口開始監聽
			ServerSocket serverScoket = new ServerSocket(8800);
			// 2:使用accept()方法阻塞等待連接配接,獲得新的連接配接
			Socket socket = serverScoket.accept();
			// 3:獲得輸入流
			InputStream is = socket.getInputStream();
			// 包裝下變成字元流
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			//建立輸出流,用來給用戶端提示的響應資訊
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);
			// 4:讀取使用者輸入的資訊
			String info = null;
			while (!((info = br.readLine()) == null)) {
				System.out.println("我是伺服器列印出來的内容,用戶端輸入的内容是:\n" + info);

			}
			//給用戶端的回應資訊
			String response="用戶端已經收到你們的資訊了,Success";
			pw.write(response);
			pw.flush();
			// 5:關閉資源,注意,關閉的時候,要從底部開始往上依次關閉,順序不能錯!
			os.close();
			pw.close();
			br.close();
			is.close();
			socket.close();
			serverScoket.close();

		} catch (IOException e) {

			e.printStackTrace();
		}

		System.out.println("本次服務端監聽結束!。。。");
	}

}


           

第三步:編寫伺服器端的代碼如下:

package com.socket.client;

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.net.UnknownHostException;

/**
 * 用戶端
 * 
 * @author lfc
 * 
 */
public class loginClient {

	public static void main(String[] args) throws UnknownHostException {

		try {
			// 1,建立serverScoket用戶端,綁定伺服器端的ip以及端口
			Socket scoket = new Socket("localhost", 8800);
			// 2,得到scoket讀寫流
			OutputStream os = scoket.getOutputStream();
			// 獲得輸入流
			InputStream is = scoket.getInputStream();
			// 包裝下變成字元流
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			// 3,利用一定的協定對scoket中的對讀寫操作
			PrintWriter pw = new PrintWriter(os);
			String info = "使用者名是:tom,密碼是:123456 ";
			pw.write(info);
			pw.flush();
			//需要先關閉,一定要記得先關閉
			scoket.shutdownOutput();
			//接收并顯示收到伺服器端傳回的資訊!
			String answer = null;
			while (!((answer = br.readLine()) == null)) {
				System.out.println("我是伺服器端接收并且給傳回的資訊:\n" + answer);

			}
			// 4,關閉流
			br.close();
			is.close();
			pw.close();
			os.close();
			scoket.close();

		} catch (IOException e) {

			e.printStackTrace();
		}
		System.out.println("用戶端請求完畢!");
	}

}

           

第四步:ctrl+f11運作服務端的代碼,運作服務端的代碼後如下:

socket程式設計一

第五步:運作用戶端的代碼  ctrl+f11  如下圖:

socket程式設計一

第六步:我們再打開伺服器端的控制台列印資訊如下圖所示:

socket程式設計一

備注:對于本次的代碼,有一個比較大的缺點是,java是面向對象程式設計的,這裡是一個字元串,不是一個對象,在socket程式設計中,實作面向對象程式設計,傳遞的是一個對象。

繼續閱讀