1. 程式人生 > >java多執行緒通訊(伺服器與多客戶端)

java多執行緒通訊(伺服器與多客戶端)

基於TCP的多執行緒通訊 伺服器執行緒: package com.netproject1; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;

public class Server extends Thread{ Socket client;//定義客戶端套接字 DataInputStream datain=null;//定義資料輸入流接收資料 InputStream in=null; DataOutputStream dataout=null;//定義資料輸出流傳輸資料 OutputStream out=null; float result;//定義計算結果 int symbol;//定義符號 public Server(Socket client){ this.client=client; }

public  void run() {
	
	try {
		in=client.getInputStream();//輸入流接收
		datain=new DataInputStream(in);//流轉換為資料
		out=client.getOutputStream();
		dataout=new DataOutputStream(out);
	while(true){
		float num_one=datain.readFloat();//讀取整型資料
		symbol=datain.readInt();//讀取數字代替的符號
		float num_two=datain.readFloat();//讀取第二次輸入的數字
		System.out.println("客戶資訊為:"+num_one+symbol+num_two);//顯示從客戶端發來的資料
		switch(symbol){//計算
			case 0:result=num_one+num_two;break;
			case 1:result=num_one-num_two;break;
			case 2:result=num_one*num_two;break;
			case 3:result=num_one/num_two;break;
		}
		dataout.writeFloat(result);//向客戶端傳輸計算結果
		Thread.sleep(2000);
		
			} 
	}catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
		e.printStackTrace();
	}
	try {//關閉套接字及各種流
		in.close();
		datain.close();
		out.close();
		dataout.close();
		client.close();
	} catch (IOException e) {
		System.out.println(client.isConnected());
		e.printStackTrace();
			}
	}
}

伺服器主方法: package com.netproject1; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;

public class ServerDemo { //客戶端斷開後可以進行重新連線 public static void main(String[] args) { ServerSocket server=null; Socket client=null; try { server=new ServerSocket(6688);//建立伺服器套接字 System.out.println(“伺服器已啟動,正在等待客戶端連線…”); }catch (IOException e) { System.out.println(“伺服器套接字建立錯誤”); } while(true){ try { client=server.accept();//連線客戶端 System.out.println(“客戶端已連線,可以進行通訊…”+client); } catch (IOException e1){ System.out.println(“客戶端連接出錯”); } if(client!=null){//用於同時連線多個客戶端 new Server(client).start(); } } } } 客戶端執行緒: package com.netproject1;

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.util.Scanner;

public class Client extends Thread{

	Socket mysocket=null;
	DataInputStream datain=null;
	InputStream in=null;
	DataOutputStream dataout=null;
	OutputStream out=null;
	
	public Client(Socket mysocket){
		this.mysocket=mysocket;
	}
	public void run(){
	try {
		out=mysocket.getOutputStream();
		dataout=new DataOutputStream(out);
		in=mysocket.getInputStream();
		datain=new DataInputStream(in);
		while(true){//迴圈輸入資料,傳送資料,讀取資料
			Scanner scanner = new Scanner(System.in);//從鍵盤輸入
			float num_one=scanner.nextFloat();//第一個數字
			int symbol=scanner.nextInt();//輸入數字代替運算子號
			float num_two=scanner.nextFloat();//第二個數字
			dataout.writeFloat(num_one);//傳送首數字
			dataout.writeInt(symbol);//傳送運算子號
			dataout.writeFloat(num_two);//傳送首數字
			float result=datain.readFloat();//讀取運算結果
			System.out.println("計算結果為:"+result);//列印運算結果
			Thread.sleep(2000);//執行緒休息
			
		}	
	} catch (IOException ee) {
		ee.printStackTrace();
	}catch (InterruptedException e) {
		e.printStackTrace();
	}
	try {//關閉套接字及各種流
		in.close();
		datain.close();
		out.close();
		dataout.close();
		mysocket.close();
	} catch (IOException e) {
		e.printStackTrace();
		}
	}

} 客戶端主方法: package com.netproject1; import java.io.IOException; import java.net.Socket;

public class ClientDemo {

public static void main(String[] args) {
	Socket mysocket=null;
	try {
		mysocket=new Socket("localhost",6688);//建立本地套接字
	} catch (IOException e) {
		e.printStackTrace();
	}
	new Client(mysocket).start();//執行緒啟動
}

}