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();//執行緒啟動
}
}