1. 程式人生 > >java網路程式設計基於TCP的多客戶端連線伺服器

java網路程式設計基於TCP的多客戶端連線伺服器

package com.test.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

class TCPThreadServerSocket implements Runnable {
	private Socket socket = null;
	private InputStream in = null;
    private OutputStream out = null;
	public TCPThreadServerSocket(Socket s) {
		this.socket = s;
	}

	@Override
	public void run() {
		try {
			//獲取服務端輸入的訊息
			in = socket.getInputStream();
			//服務端返回的訊息
			out = socket.getOutputStream();
			//用一個位元組數字來存放訊息,提高效率
			byte[] recData = new byte[1024];
			in.read(recData);
			String data = new String(recData);

			System.out.println("讀取到客戶端傳送來的資料:" + data);
			//返回給客戶端的訊息
			out.write("Hello client I am server".getBytes());

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				//關閉資源
				in.close();
				out.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

public class TCPThreadServer {
	private static final int PORT = 6666;

	public static void main(String[] args) {
		int count = 1;
		try {
			/**
			 * 建立一個ServerSocket物件,並給它制定一個埠號,
			 * 通過這個埠號來監聽客戶端的連線,服務端接受客戶端連線的請求是
			 * 不間斷地接受的,所以服務端的程式設計一般都永無休止的執行
			 */
			ServerSocket ss = new ServerSocket(PORT);
			System.out.println("伺服器已經啟動。。。");
			while (true) {
				/**
				 * 在服務端呼叫accept()方法接受客戶端的連線物件,accept()方法是
				 * 一個阻塞式的方法,一直傻傻地等待著是否有客戶端申請連線
				 */
				
				Socket s = ss.accept();
				System.out.println("第" + count + "個連線,IP地址是:"
						+ s.getInetAddress());
				count++;
				/**
				 * 服務端使用多執行緒方便多客戶端的連線
				 * 這裡將服務端的socket傳給內部類,方便每個客戶端都建立一個執行緒
				 */
				Thread t = new Thread(new TCPThreadServerSocket(s));
				t.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

二、客戶端A程式碼:

package com.test.net;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientASocket {

	private static final int PORT = 6666;
	
	public static void main(String[] args) {
		Socket s = null;
		OutputStream out = null;
		InputStream in = null;
		DataOutputStream dos = null;
		DataInputStream dis = null;
		String serverHost = "127.0.0.1";
		byte[] b = new byte[1024];
		try {
			/**
			 * 客戶端通過IP和埠和伺服器連線,連線上服務端後
			 * 就可以像服務端輸出訊息和接受服務端返回的訊息
			 * 通過IP就能找到一臺獨一無二的電腦終端,通過PORT找到
			 * 終端的某一個獨立的應用程式
			 */
			s = new Socket(serverHost, PORT);
			out = s.getOutputStream();
			dos = new DataOutputStream(out);
			dos.write("Hello Server I am client A".getBytes());
			in = s.getInputStream();
			dis = new DataInputStream(in);
		    dis.read(b);
			String serverToClient = new String(b);
				System.out.println("服務端返回到客戶端的資訊:"+serverToClient);
		} catch (UnknownHostException e) {
			System.out.println("Host未知。。。");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				//最後要關閉資源
				out.close();
				in.close();
				dos.close();
				dos.close();
				s.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

客戶端B程式碼和A的基本一樣

三、執行結果:

先啟動服務端再執行客戶端A程式碼和客戶端B程式碼,執行結果如下: