91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java編程Socket如何實現多個客戶端連接同一個服務端

發布時間:2021-07-28 09:52:14 來源:億速云 閱讀:199 作者:小新 欄目:編程語言

這篇文章主要介紹Java編程Socket如何實現多個客戶端連接同一個服務端,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Java Socket(套接字)通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。

使用Socket實現多個客戶端和同一客戶端通訊;首先客戶端連接服務端發送一條消息,服務端接收到消息后進行處理,完成后再回復客戶端一條消息。本人通過自己的思維編寫了一份服務端和客戶端實現的代碼,望能與大家相互學習,共同進步。

服務端代碼

/**
 * Socket服務端
 * 功能說明:
 * 
 */
public class Server {
	/**
   * 入口
   * 
   * @param args
   * @throws IOException
   */
	public static void main(String[] args) throws IOException {
		// 為了簡單起見,所有的異常信息都往外拋
		int port = 8899;
		// 定義一個ServiceSocket監聽在端口8899上
		ServerSocket server = new ServerSocket(port);
		System.out.println("等待與客戶端建立連接...");
		while (true) {
			// server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
			Socket socket = server.accept();
			/**
       * 我們的服務端處理客戶端的連接請求是同步進行的, 每次接收到來自客戶端的連接請求后,
       * 都要先跟當前的客戶端通信完之后才能再處理下一個連接請求。 這在并發比較多的情況下會嚴重影響程序的性能,
       * 為此,我們可以把它改為如下這種異步處理與客戶端通信的方式
       */
			// 每接收到一個Socket就建立一個新的線程來處理它
			new Thread(new Task(socket)).start();
		}
		// server.close();
	}
	/**
   * 處理Socket請求的線程類
   */
	static class Task implements Runnable {
		private Socket socket;
		/**
     * 構造函數
     */
		public Task(Socket socket) {
			this.socket = socket;
		}
		@Override
		    public void run() {
			try {
				handlerSocket();
			}
			catch (Exception e) {
				e.printStackTrace();
			}
		}
		/**
     * 跟客戶端Socket進行通信
     * 
     * @throws IOException
     */
		private void handlerSocket() throws Exception {
			// 跟客戶端建立好連接之后,我們就可以獲取socket的InputStream,并從中讀取客戶端發過來的信息了
			/**
       * 在從Socket的InputStream中接收數據時,像上面那樣一點點的讀就太復雜了,
       * 有時候我們就會換成使用BufferedReader來一次讀一行
       * 
       * BufferedReader的readLine方法是一次讀一行的,這個方法是阻塞的,直到它讀到了一行數據為止程序才會繼續往下執行,
       * 那么readLine什么時候才會讀到一行呢?直到程序遇到了換行符或者是對應流的結束符readLine方法才會認為讀到了一行,
       * 才會結束其阻塞,讓程序繼續往下執行。
       * 所以我們在使用BufferedReader的readLine讀取數據的時候一定要記得在對應的輸出流里面一定要寫入換行符(
       * 流結束之后會自動標記為結束,readLine可以識別),寫入換行符之后一定記得如果輸出流不是馬上關閉的情況下記得flush一下,
       * 這樣數據才會真正的從緩沖區里面寫入。
       */
			BufferedReader br = new BufferedReader(
			          new InputStreamReader(socket.getInputStream(), "UTF-8"));
			StringBuilder sb = new StringBuilder();
			String temp;
			int index;
			while ((temp = br.readLine()) != null) {
				if ((index = temp.indexOf("eof")) != -1) {
					// 遇到eof時就結束接收
					sb.append(temp.substring(0, index));
					break;
				}
				sb.append(temp);
			}
			System.out.println("Form Cliect[port:" + socket.getPort()
			          + "] 消息內容:" + sb.toString());
			// 回應一下客戶端
			Writer writer = new OutputStreamWriter(socket.getOutputStream(),
			          "UTF-8");
			writer.write(String.format("Hi,%d.天朗氣清,惠風和暢!", socket.getPort()));
			writer.flush();
			writer.close();
			System.out.println(
			          "To Cliect[port:" + socket.getPort() + "] 回復客戶端的消息發送成功");
			br.close();
			socket.close();
		}
	}
}

客戶端代碼

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.Socket;
/** * Socket客戶端
* 功能說明: * * @author 大智若愚的小懂 * @Date 2016年8月30日 * @version 1.0 */
public class Client {
	/** * 入口 * @param args */
	public static void main(String[] args) {
		// 開啟三個客戶端,一個線程代表一個客戶端 
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {
				@Override public void run() {
					try {
						TestClient client = TestClientFactory.createClient();
						client.send(String.format("Hello,Server!I'm %d.這周末天氣如何。", client.client.getLocalPort()));
						client.receive();
					}
					catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			).start();
		}
	}
	/** * 生產測試客戶端的工廠 */
	static class TestClientFactory {
		public static TestClient createClient() throws Exception {
			return new TestClient("127.0.0.1", 8899);
		}
	}
	/** * 測試客戶端 */
	static class TestClient {
		/** * 構造函數 * @param host 要連接的服務端IP地址 * @param port 要連接的服務端對應的監聽端口 * @throws Exception */
		public TestClient(String host, int port) throws Exception {
			// 與服務端建立連接 
			this.client = new Socket(host, port);
			System.out.println("Cliect[port:" + client.getLocalPort() + "] 與服務端建立連接...");
		}
		private Socket client;
		private Writer writer;
		/** * 發送消息 * @param msg * @throws Exception */
		public void send(String msg) throws Exception {
			// 建立連接后就可以往服務端寫數據了 
			if(writer == null) {
				writer = new OutputStreamWriter(client.getOutputStream(), "UTF-8");
			}
			writer.write(msg);
			writer.write("eof\n");
			writer.flush();
			// 寫完后要記得flush 
			System.out.println("Cliect[port:" + client.getLocalPort() + "] 消息發送成功");
		}
		/** * 接收消息 * @throws Exception */
		public void receive() throws Exception {
			// 寫完以后進行讀操作 
			Reader reader = new InputStreamReader(client.getInputStream(), "UTF-8");
			// 設置接收數據超時間為10秒 
			client.setSoTimeout(10*1000);
			char[] chars = new char[64];
			int len;
			StringBuilder sb = new StringBuilder();
			while ((len = reader.read(chars)) != -1) {
				sb.append(new String(chars, 0, len));
			}
			System.out.println("Cliect[port:" + client.getLocalPort() + "] 消息收到了,內容:" + sb.toString());
			reader.close();
			// 關閉連接 
			writer.close();
			client.close();
		}
	}
}

接下來模擬一下:

1.首先運行服務端

Java編程Socket如何實現多個客戶端連接同一個服務端

2.接著運行客戶端(開三個客戶端請求)

為了演示有所區分,服務端我使用的是Eclipse工具,客戶端使用的是IntelliJ IDEA工具。這時可以看到客戶端在控制臺打印出來的消息

Java編程Socket如何實現多個客戶端連接同一個服務端

一個Port端口號代表一個客戶端,回過來看下服務端在控制臺打印出來的消息

Java編程Socket如何實現多個客戶端連接同一個服務端

以上是“Java編程Socket如何實現多個客戶端連接同一個服務端”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

睢宁县| 射洪县| 锡林郭勒盟| 武胜县| 北海市| 金乡县| 德惠市| 托克逊县| 北流市| 延寿县| 营山县| 西乌珠穆沁旗| 靖边县| 建德市| 蓝山县| 天水市| 禹城市| 茂名市| 清远市| 普格县| 泸溪县| 平乐县| 定陶县| 上饶县| 望江县| 保德县| 辛集市| 普洱| 丘北县| 丹江口市| 霞浦县| 朝阳县| 定兴县| 鲁山县| 曲麻莱县| 攀枝花市| 宿迁市| 呈贡县| 文安县| 邛崃市| 军事|