[java] Demo thực hiện tính biểu thức qua server

chuotfx

Member
4/4/10
365
25
18
Dạo này bận túi bụi, đang code cái đồ án nên kô tiếp tục post tiếp loạt bài về java lập trình mạng đc. Nêu thui demo 1 cái gọi là chuẩn bị cho bài đó vậy

Dựa trên mô tình client/ server
Truyền dữ liệu thông qua socket/ tcp

Chạy thì chạy server trước, chạy client sau

Biểu thức gõ vào dạng trung tố , dùng cho toán tử 2 ngôi, kô dùng đc với dấu ( ) --> để update sau vậy

chĩ làm đơn giản với + - * / thui, và phải viết cánh ra nghe

Ví dụ : 1 + 2 * 3 - 4 / 2 = 5

Server:

PHP:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class OperatorSever {
	public void in(String[] data,int len){
		for(int i=0; i< len;i++){
			System.out.print(data[i]);
		}
		System.out.println();
	}
	public String[] xoa(String [] data , int vitri ){
		for(int i=vitri+2;i<data.length;i++){
			data[i-2]=data[i];
		}
		return data;
	}
	public String tinh(float so1,float so2, int dau){
		float so=0;
		switch(dau){
			case 1 :
				so=so1+so2;
				break;
			case 2 :
				so=so1-so2;
				break;
			case 3 :
				so=so1*so2;
				break;
			case 4 :
				so=so1/so2;
				break;
		}
		return Float.toString(so);
	}
	public String xuly(String in){
		String [] temp = in.split(" ");
		int len = temp.length;
		
		// do * /
		int i=1;
		while(i<len -1){
			if(temp[i].compareTo("*")==0){
				temp[i-1]=tinh(Float.parseFloat(temp[i-1]),Float.parseFloat(temp[i+1]),3);
				temp=xoa(temp,i);
				i=1;len-=2;
			}else if(temp[i].compareTo("/")==0){
				temp[i-1]=tinh(Float.parseFloat(temp[i-1]),Float.parseFloat(temp[i+1]),4);
				temp=xoa(temp,i);
				i=1;len-=2;
			}else i+=2;
		}
		
		i=1;
		while(i<len -1){
			if(temp[i].compareTo("+")==0){
				temp[i-1]=tinh(Float.parseFloat(temp[i-1]),Float.parseFloat(temp[i+1]),1);
				temp=xoa(temp,i);
				i=1;len-=2;
			}else if(temp[i].compareTo("-")==0){
				temp[i-1]=tinh(Float.parseFloat(temp[i-1]),Float.parseFloat(temp[i+1]),2);
				temp=xoa(temp,i);
				i=1;len-=2;
			}else i+=2;
		}
		return "Ket qua : "+temp[0];
	}
	public void go(){
		try {
			ServerSocket server = new ServerSocket(2011);
			System.out.println("Bat dau chay server");
			
			DataInputStream in_put=null;
			DataOutputStream out_put=null;
			
			while(true){
				// chap nhan ket noi
				Socket client = server.accept();		
				in_put = new DataInputStream(client.getInputStream());
				out_put = new DataOutputStream(client.getOutputStream());
				
				// lay du lieu
				String data_in = in_put.readUTF();
				
				// kiem tra dieu kien thoat
				if((data_in.toUpperCase()).compareTo("QUIT")==0) {
					client.close();
					continue;
				}
				
				// xuat du lieu
				out_put.writeUTF(xuly(data_in));
				client.close();
			}
		} catch (IOException e) {
			System.out.println("Loi tao socket Server");
		}
	}

	public static void main(String[] args) {
		new OperatorSever().go();
	}
}
Client:

PHP:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class OperatorClient {
	public void go(){
		try {
			Socket client = null;
			DataOutputStream out_put = null;
			DataInputStream in_put = null;
			
			while(true){
				client = new Socket("localhost",2011);
				out_put = new DataOutputStream(client.getOutputStream());
				in_put = new DataInputStream(client.getInputStream());
				// nhap du lieu tu ban phim	
				Scanner sc = new Scanner(System.in);
				String data_out = sc.nextLine();
				
				// xuat du lieu	
				out_put.writeUTF(data_out);
				
				// kiem tra thoat
				if((data_out.toUpperCase()).compareTo("QUIT")==0) {
					client.close();
					break;
				}
				
				// xuat du lieu
				System.out.println(in_put.readUTF());
				
				client.close();
			}
	
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new OperatorClient().go();
	}
}
chạy hơi mệt vì kô làm giao diện nên chạy bằng DOS nha :



Các bạn chú ý chỗ hàm go() thì đó là mô hình truyền tin theo TCP đó à
 
  • Like
Reactions: coderslazy
10/12/10
286
10
18
Ðề: [java] Demo thực hiện tính biểu thức qua server

ui, bác viết code đẹp quá.
//làm sao để nó ra cửa sổ DOS trong eclipse vậy bác?
 

chuotfx

Member
4/4/10
365
25
18
Ðề: [java] Demo thực hiện tính biểu thức qua server

đâu có mở đc, do chup ảnh để eclipse cho đẹp thui, vào run -> cmd mà :D
 

lamhungdatinh

New Member
6/5/11
2
0
0
Ðề: [java] Demo thực hiện tính biểu thức qua server

Em chào anh chuotfx
Anh giúp dùng em lập trình mạng bằng java được không anh.
Em đang học mạng mà thầy bảo làm bài báo cáo lập trình bằng java mà em thì mới học java thôi nên còn yếu lắm, mong anh giúp dùm em, ngày 14/5/2011 là em phải báo cáo rồi, em cầu xin anh giúp dùm em.
Đề tài của em là: từ máy server 1 gởi 1 biểu thức (1+2)* (9-6) xuống cho 2 server 2 và server 3
server 2 thì tính phần biểu thức (1+2) và server 3 thì tính phần biểu thức (9-6)
kết quả của server 2 và 3 sẽ gởi về cho server 1, và server 1 lấy 2 kết quả này nhân lại với nhau, và kết quả của server 1 server chuyển đến cho máy client A..
Mong Anh giup dùm em, em không biết sử lý làm cách nào để lấy (1+2) chuyển cho server 2 và (9-6) chuyển cho server 3. có dấu () này khó quá anh ơi.
Mong anh code hướng dẫn dùm em
Em sử dụng lập trình phân tán bằng Jcreator và theo phương pháp RMI
Anh có thể gởi cho em qua địa chỉ mail là: lamhungdatinh@gmail.com hoặc ngthanhnhan1987@gmail.com
Cám ơn anh nhiều.
 

traithanh

New Member
16/5/12
1
0
1
32
Anh ơi sao em tải code về mà nó không tính ra kết quả. Nó chỉ in ra nhưng gì mình nhập thôi