基于TCP的计算器(Java)

一款基于TCP通信的计算器,客户端通过按钮向服务器发送数据,服务器对数据进行计算处理,将计算结果发送回客户端。当中运用多线程进行启用。

服务器线程:
package com.netproject2;

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 CalculatorServer extends Thread{
public final double PI=3.1415927;//定义圆周率
Socket client;//定义客户端套接字
DataInputStream datain=null;//定义数据输入流接收数据
InputStream in=null;
DataOutputStream dataout=null;//定义数据输出流传输数据
OutputStream out=null;
float num_one;
float num_two;
float result;//定义计算结果
int symbol;//定义符号
public CalculatorServer(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){
		symbol=datain.readInt();//读取数字代替的符号
		switch(symbol){//计算
			case 1:
				num_two=datain.readFloat();//读取第二次输入的数字
			    result=(float) Math.sin(num_two*PI/180);
			    dataout.writeFloat(result);break;//向客户端传输计算结果
			case 2:
				num_two=datain.readFloat();//读取第二次输入的数字
		   	    result=(float) Math.cos(num_two*PI/180);
		        dataout.writeFloat(result);break;//向客户端传输计算结果
			case 3:
				num_two=datain.readFloat();//读取第二次输入的数字
		        result=(float) Math.tan(num_two*PI/180);
		        dataout.writeFloat(result);break;//向客户端传输计算结果
			case 4:
				num_two=datain.readFloat();//读取第二次输入的数字
		        result=(float) Math.sqrt(num_two*PI/180);
		        dataout.writeFloat(result);break;//向客户端传输计算结果
			case 5:
				num_one=datain.readFloat();//读取整型数据
			    num_two=datain.readFloat();//读取第二次输入的数字
			    result=num_one+num_two;
			    dataout.writeFloat(result);break;//向客户端传输计算结果
			case 6:
				num_one=datain.readFloat();//读取整型数据
				num_two=datain.readFloat();//读取第二次输入的数字
				result=num_one-num_two;
				dataout.writeFloat(result);break;//向客户端传输计算结果
			case 7:
				num_one=datain.readFloat();//读取整型数据
				num_two=datain.readFloat();//读取第二次输入的数字
				result=num_one*num_two;
				dataout.writeFloat(result);break;//向客户端传输计算结果
			case 8:
				num_one=datain.readFloat();//读取整型数据
				num_two=datain.readFloat();//读取第二次输入的数字
				result=num_one/num_two;
				dataout.writeFloat(result);break;//向客户端传输计算结果
			default:break;
		}
			} 
	}catch (IOException 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.netproject2;

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

public class DemoServer {
//客户端断开后可以进行重新连接
public static void main(String[] args) {
ServerSocket server=null;
Socket client=null;
try {
server=new ServerSocket(8866);//创建服务器套接字
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 CalculatorServer(client).start();
}
}
}
}
客户端线程:
package com.netproject2;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class CalculatorClient extends JFrame implements Runnable,ActionListener{

	Socket client=null;
	DataInputStream datain=null;
	InputStream in=null;
	DataOutputStream dataout=null;
	OutputStream out=null;
	String[][] inputButtonNames={{"sin","cos","tan","√"},{"1","2","3","+"},{"4","5","6","-"},{"7","8","9","*"},{".","0","=","/"}};
	//定义二维数组承装按钮名称inputButtonNames
	JTextField show=new JTextField();//创建输入框textField
	JButton[] inButton=new JButton[20];//创建输入按钮inButton
	String[] resetButtonNames={"    清        空     ","    清       除      "};//定义清除按钮名称resetButtonNames
	JButton[] resetButton=new JButton[2];//创建清除按钮resetButton
	String tempText="";//用于临时存放第一次获取的按钮数字(字符串)
	
	int symbol=0;//用于判断运算符号
	float num_one;//用于存放输入运算符号前的数字(已经过转换)
	float num_two;//用于存放输入运算符号后的数字(已经过转换)
	float result;//用于存放运算结果
	int number=0;//用于判断输入的次数 	 
	boolean com=false;//用于判断是否输入了运算符号及小数点
	
	
	public CalculatorClient(){//计算面板的无参构造函数		
		super("客户端");//调用父类方法
		this.setBounds(300,300,252, 264);//设置窗体大小及出现在屏幕的位置
		
		JPanel ibp=new JPanel();//创建输入框面板input box panel
		show.setText("0");//设置输入框初始数字"0"
		show.setColumns(21);//设置输入框列数
		show.setEditable(false);//设置输入框为不可编辑状态
		show.setHorizontalAlignment(SwingConstants.RIGHT);//设置输入框的方位:北
		ibp.add(show);//将输入框添加至输入框面板
		this.add(ibp, BorderLayout.NORTH);//设置输入框面板的方位:置北
		
		JPanel bp=new JPanel();//设置输入按钮面板button panel
		GridLayout gridLayout=new GridLayout(5,4,4,4);//网格式布局
		bp.setLayout(gridLayout);//输入按钮面板使用网格布局
		for(int i=0;i<5;i++){//利用数组、循环逐个植入输入按钮
			for(int j=0;j<inputButtonNames[0].length;j++){
				inButton[i*4+j]=new JButton(inputButtonNames[i][j]);
				bp.add(inButton[i*4+j]);//将输入按钮添加至输入按钮面板
				inButton[i*4+j].addActionListener(this);//赋予动作监听
			}
		}
		this.add(bp, BorderLayout.SOUTH);//设置输入按钮面板的方位:置南
		
		JPanel cbp=new JPanel();//创建清除按钮及三角函数按钮面板clean button panel		
		for(int i=0;i<resetButtonNames.length;i++){利用数组、循环逐个植入清除按钮
			resetButton[i]=new JButton(resetButtonNames[i]);
			cbp.add(resetButton[i]);//将清除按钮添加至清除按钮
			resetButton[i].addActionListener(this);//赋予动作监听
		}
		this.add(cbp, BorderLayout.CENTER);//设置清除按钮面板的方位:置中
		
		this.setVisible(true);//设置窗体为可见
		
		try {
			client=new Socket("localhost",8866);//创建本地套接字
		} catch (IOException e4) {
			e4.printStackTrace();
		}
		try {
			out=client.getOutputStream();
			dataout=new DataOutputStream(out);
			in=client.getInputStream();
			datain=new DataInputStream(in);
		} catch (IOException ee) {
			ee.printStackTrace();
		}			
	}
	
	public void run(){//线程运行
		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource() == inButton[0]) {//sin的动作监听
			com=true;
			number=0;
			symbol=1;
			show.setText("sin");
			}
		else if(e.getSource() == inButton[1]) {//cos的动作监听
			com=true;
			number=0;
			symbol=2;
			show.setText("cos");
			}
		else if(e.getSource() == inButton[2]) {//tan的动作监听
			com=true;
			number=0;
			symbol=3;
			show.setText("tan");
			}
		else if(e.getSource() == inButton[3]) {//开方的动作监听
			com=true;
			number=0;
			symbol=4;
			show.setText("√");
			}
		else if (e.getSource() == inButton[4]) {//数字1的动作监听
			if(com==true||number==0){//第一次输入
			show.setText("1");//输出第一次输入的数字
			number=1;
			com=false;
			}
			else{				//非第一次输入
				tempText=show.getText();//获取第一次输入的数字
				show.setText(tempText+"1");//将n次输入的数字一同输出
			}	
		}
		else if (e.getSource() == inButton[5]) {//数字2的动作监听
			if(com||number==0){
				show.setText("2");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"2");
				}	
			}
		else if (e.getSource() == inButton[6]) {//数字3的动作监听
			if(com||number==0){
				show.setText("3");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"3");
				}	
			}
		else if (e.getSource() == inButton[7]) {	//加号的动作监听		
			com=true;
			number=0;
			symbol=5;
			num_one=Float.parseFloat(show.getText());//将获取的字符串转换为数字
			show.setText("+");
		}
		else if (e.getSource() == inButton[8]) {//数字4的动作监听
			if(com||number==0){
				show.setText("4");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"4");
				}	
			}
		else if (e.getSource() == inButton[9]) {//数字5的动作监听
			if(com||number==0){
				show.setText("5");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"5");
				}	
			}
		else if (e.getSource() == inButton[10]) {//数字6的动作监听
			if(com||number==0){
				show.setText("6");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"6");
				}	
			}
		else if (e.getSource() == inButton[11]) {//减号的动作监听
			com=true;
			number=0;
			symbol=6;
			num_one=Float.parseFloat(show.getText());//将获取的字符串转换为数字
			show.setText("-");
			}
		else if (e.getSource() == inButton[12]) {//数字7的动作监听
			if(com||number==0){
				show.setText("7");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"7");
				}	
			}
		else if (e.getSource() == inButton[13]) {//数字8的动作监听
			if(com||number==0){
				show.setText("8");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"8");
				}	
			}
		else if (e.getSource() == inButton[14]) {//数字9的动作监听
			if(com||number==0){
				show.setText("9");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"9");
				}	
			}
		else if (e.getSource() == inButton[15]) {//乘号的动作监听
			com=true;
			number=0;
			symbol=7;
			num_one=Float.parseFloat(show.getText());//将获取的字符串转换为数字
			show.setText("*");
			}
		else if (e.getSource() == inButton[16]) {
			if(com||number==0){//有待完善:使得第一次不能按此按钮
				show.setText(".");
				number=1;
				com=false;
				}
				else{//判断已获取的字符串中是否含有小数点“.”
					tempText=show.getText();
					if(tempText.indexOf(".")==-1){
						show.setText(tempText+".");
					}
					else{show.setText(tempText);}
				}	
			}
		else if (e.getSource() == inButton[17]) {//数字0的动作监听
			if(com||number==0){
				show.setText("0");
				number=1;
				com=false;
				}
				else{
					tempText=show.getText();
					show.setText(tempText+"0");
				}	
			}
		else if (e.getSource() == inButton[18]) {//等号的动作监听
			num_two=Float.parseFloat(show.getText());//获取输入运算符号后的字符串并转换
			
			switch(symbol){
				case 1:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
				       number=0;//同上注释
					   show.setText(""+result);
					} catch (IOException e2) {
					e2.printStackTrace();
					}break;
				case 2:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
				       number=0;//同上注释
					   show.setText(""+result);
					} catch (IOException e2) {
					e2.printStackTrace();
					}break;
				case 3:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
				       number=0;//同上注释
					   show.setText(""+result);
					} catch (IOException e2) {
					e2.printStackTrace();
					}break;
				case 4:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
				       number=0;//同上注释
					   show.setText(""+result);
					} catch (IOException e2) {
					e2.printStackTrace();
					}break;
				case 5:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_one);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
				       number=0;//同上注释
					   show.setText(""+result);
					} catch (IOException e1) {
					e1.printStackTrace();
					}break;
				case 6:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_one);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
					   number=0;//同上注释
					   show.setText(result+"");
					} catch (IOException e1) {
					e1.printStackTrace();
					}break;
				case 7:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_one);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
					   number=0;//同上注释
					   show.setText(result+"");
					} catch (IOException e1) {
					e1.printStackTrace();
					}break;
				case 8:try {
					   dataout.writeInt(symbol);
					   dataout.writeFloat(num_one);
					   dataout.writeFloat(num_two);
					   result=datain.readFloat();
					   number=0;//同上注释
					   show.setText(result+"");
					} catch (IOException e1) {
					e1.printStackTrace();
					}break;
				default:number=0;break;//同上注释
			}
		}
		else if(e.getSource() == inButton[19]) {//除号的动作监听
			com=true;
			number=0;
			symbol=8;
			num_one=Float.parseFloat(show.getText());//将获取的字符串转换为数字
			show.setText("/");
			}
		else if (e.getSource() == resetButton[0]){//清空按钮AC
			number=0;//效果和等号"number=0"的解释一样
			symbol=0;//重置symbol
			show.setText("0");
		}
		else if (e.getSource() == resetButton[1]){//单个字节清除按钮C
			number=0;//效果和等号"number=0"的解释一样
			symbol=0;//重置symbol
		 	tempText=show.getText();
			if(tempText.equals("sin")||tempText.equals("cos")||tempText.equals("tan")||(tempText.length()-1)==0){//判断tempText是否为单字节
				show.setText("0");
			}
			else {
				show.setText(tempText.substring(0,tempText.length()-1));
				 if(tempText.length()==0)
					 {show.setText("0");}
				 }
		}		
	}	
}

客户端主方法:
package com.netproject2;

public class DemoClient {

public static void main(String[] args) {
	
	CalculatorClient p = new CalculatorClient();
     new Thread(p).start();
}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值