1. 程式人生 > >java--實現多個客戶端與服務端連線

java--實現多個客戶端與服務端連線

在客戶端與服務端的簡單連線上進行了略微的新增,實現了多個客戶端與服務端的連線

目的:

多個客戶端與服務端的連線,實現服務端發訊息客戶端可以接受到

程式碼:

服務端

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {
	// 存放服務端接收到的客戶端類(可以進行操作)的佇列
	public ArrayList<ClientServer> clientServer;

	public Server() {
		// TODO Auto-generated constructor stub
		// 初始化佇列
		clientServer = new ArrayList<ClientServer>();
	}

	public void initServer() {
		try {
			// 建立監聽的埠號
			ServerSocket s = new ServerSocket(8888);
			System.out.println("啟動伺服器.....");
			System.out.println("等待客戶機進入.......");
			// 讓server進入阻塞狀態(等待客戶機的進入),有客戶機連線上此埠的server客戶端就會返回一個socket物件,伺服器進行接受
			// 不斷的去接受客戶端發來的請求,並將接受到的socket放到佇列中
			while (true) {
				Socket ss = s.accept();
				clientServer.add(new ClientServer(ss));
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Server server = new Server();
		server.initServer();

	}

	/**
	 * 操作類,接受了socket,進行服務端對客戶端的操作
	 * 
	 * @author M_WBCG
	 * 
	 */
	class ClientServer {
		Socket ss;

		public ClientServer(Socket ss) {
			// TODO Auto-generated constructor stub
			this.ss = ss;
			// socket的輸出流(該流為位元組流)
			OutputStream out;
			try {
				out = ss.getOutputStream();
				String msg = "伺服器說你好\n";
				out.write(msg.getBytes());
				// 將流和socket關掉,不關掉客戶端在未接受到訊息的時候會斷開連線
				out.close();
				ss.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


客戶端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	public static void main(String[] args) {
		Socket s;
		try {
			// 客戶機連線服務端的IP地址和埠號
			s = new Socket("127.0.0.1", 8888);
			System.out.println("連線到伺服器.....");
			// 獲得輸入流(位元組流),再把位元組輸入流放到緩衝輸入流中
			InputStream in = s.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			String msg = "";
			msg = br.readLine();
			System.out.println(msg);
			//關閉掉流
			br.close();
			in.close();
			s.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

說明

客戶端與之前並沒有什麼改動,服務端在接受客戶端的時候使用while(true)不斷的迴圈接受客戶端發來的請求,並將接受到的socket儲存下來,可以進行細節操作,實現一對多 之前有說過socket通道流如果沒有接受到請求是一直處於阻塞狀態,那麼怎樣可以實現客戶端與服務端的互動可(可以同時傳送訊息和就收訊息)?