一款基于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
客户端主方法:
package com.netproject2;
public class DemoClient {
public static void main(String[] args) {
CalculatorClient p = new CalculatorClient();
new Thread(p).start();
}
}