学号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.运行截图

实验心得体会

-实验的完成借助了很多资料的查询和同学学长的帮助,自身能力还有待提高
-进行远程传输时,应在程序增加适当的提示语言,以此定位程序运行的进度,便于在出现问题时进行查找
-实现远程计算器时,输入的应为字符串形式,然后将数字提取出来,放入计算器中进行运算

posted @ 2020-10-31 13:49  √子非鱼  阅读(123)  评论(0编辑  收藏  举报