学号20192314 实验四 《数据结构与面向对象程序设计》实验报告
(一)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。
1.代码如下:
//import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args) throws IOException {
//1.建立一个服务器Socket(ServerSocket)绑定指定端口
ServerSocket serverSocket=new ServerSocket(8809);
//2.使用accept()方法阻止等待监听,获得新连接
Socket socket=serverSocket.accept();
//3.获得输入流
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
//获得输出流
OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);
//4.读取用户输入信息
String info=null;
System.out.println("服务器已经建立......");
while(!((info = bufferedReader.readLine()) ==null)){
System.out.println("我是服务器,用户信息为:" + info);
}
//给客户一个响应
String reply="welcome";
printWriter.write(reply);
printWriter.flush();
//5.关闭资源
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
2.结对伙伴:20192302,20192304
3.运行截图
(二)Java和密码学
参考 http://www.cnblogs.com/rocedu/p/6683948.html
以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。
1.结对伙伴:20192302,20192304
2.运行截图
(三)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。
1.有理数计算器代码
子类
//import java.util.Scanner;
public class Rational
{
public static void Intager() {
Scanner sc = new Scanner(System.in);
float a;
float b;
float c;
System.out.println("Please input a:");
a = sc.nextFloat();
System.out.println("Please input b:");
b = sc.nextFloat();
while (b == 0) {
System.out.println("Please retry!");
b = sc.nextFloat();
}
System.out.println("Please choose your algorithm:(+ — * / %)");
String op = sc.next();
switch (op) {
case "+":
System.out.println(a + "+" + b + "=" + (a + b));
break;
case "-":
System.out.println(a + "-" + b + "=" + (a - b));
break;
case "*":
System.out.println(a + "*" + b + "=" + (a * b));
break;
case "/":
System.out.println(a + "/" + b + "=" + (a / b));
break;
case "%":
System.out.println(a + "%" + b + "=" + (a - (int) (a / b) * b));
break;
default:
System.out.println("Error in Identification"
+ " Character.");
}
}
}
父类
//import java.util.Scanner;
public class RationalDad {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = 0;
int m;
int x = 1;
float c;
while (x == 1) {
Rational.Intager();
}
System.out.println("Do it again?(yes is 1,no is 2)");
n = sc.nextInt();
if (n == 1)
x = 1;
if (n == 2)
x = 0;
}
}
2.运行截图
(四)远程有理数计算器
结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
1.结对伙伴20192302,20192304,我是客户端
2.运行截图
(五)远程复数计算器
结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!!
1.我是服务器端,代码:
计算器
//import java.io.*;
import java.lang.Float;
import java.util.*;
import java.lang.*;
import java.math.*;
import java.sql.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
public class jisuan {
public static String jieguo(String str)
{
int a=str.length();//a是字符串的长度。
int b=str.lastIndexOf("(");//b是(最后一次出现。
String fushu1=str.substring(1,b-3);//substring不包括尾部。
String fushu2=str.substring(b+1,a-2);
char A=str.charAt(b-1);//复数运算符 // c
int c=fushu1.indexOf("+");//c是复数1的加号的位置。 //... + ... i
String real1=fushu1.substring(0,c-1); //0 c-1 c+1 b-5 b-4
String ima1=fushu1.substring(c+1,b-5);
int d=fushu2.indexOf("+"); // . . . . . + . . . . i
String real2=fushu2.substring(0,d-1); //0 d-1 d d+1 a-b-4 a-3-b
String ima2=fushu2.substring(d+1,a-b-4);
float r1= Float.parseFloat(real1);
float r2=Float.parseFloat(real2);
float i1=Float.parseFloat(ima1);
float i2=Float.parseFloat(ima2);
float r=0;
float i=0;
if(A=='+')
{
r=r1+r2;
i=i1+i2;
}
else if (A=='-')
{
r=r1-r2;
i=i1-i2;
}
else if(A=='*')
{
r=r1*r2-i1*i2;
i=r1*i2+r2*i1;
}
else if (A=='/')
{
r=(r1*r2+i1*i2)/(r2*r2+i2*i2);
i=(i1*r2-i2*r1)/(r2*r2+i2*i2);
}
String R=r+"+"+i+"i"+"";
return R;
}
}
连接端
//import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class yuanchengfushu {
public static void main(String[] args) throws IOException, ScriptException {
//1.建立一个服务器Socket(ServerSocket)绑定指定端口
ServerSocket serverSocket=new ServerSocket(8800);
//2.使用accept()方法阻止等待监听,获得新连接
Socket socket=serverSocket.accept();
//3.获得输入流
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
//获得输出流
OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);
//4.读取用户输入信息
String info=null;
System.out.println("服务器已经建立......");
info = bufferedReader.readLine();
System.out.println("我是服务器,用户信息为:" + info);
String reply="";
jisuan s=new jisuan();
reply=s.jieguo(info);
printWriter.write(reply);
printWriter.flush();
//5.关闭资源
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
2.运行截图
实验心得体会
-实验的完成借助了很多资料的查询和同学学长的帮助,自身能力还有待提高
-进行远程传输时,应在程序增加适当的提示语言,以此定位程序运行的进度,便于在出现问题时进行查找
-实现远程计算器时,输入的应为字符串形式,然后将数字提取出来,放入计算器中进行运算