实验内容

1.掌握Socket程序的编写;

2.掌握密码技术的使用;

3.设计安全

4、对通信内容进行摘要计算并验证

实验步骤

1.信息安全传送:

发送方A——————>接收方B

A加密时,用B的公钥

B解密时,用B的私钥

  发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递。同时用hash函数将明文进行用作验证。

    接收方B接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的信息(明文)。用hash函数对解出的明文进行验证,与发送过来的hash值相等,验证通过。

2.实验代码:

客户端代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package client;

// file name:ComputeTCPClient.java
import java.net.*;
import java.io.*;
import java.security.*;

public class Main
{
public static void main(String srgs[])
{
try
{
testdes DES = new testdes();
//创建连接特定服务器的指定端口的Socket对象
Socket socket = new Socket("127.0.0.1", 8002);
//获得从服务器端来的网络输入流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获得从客户端向服务器端输出数据的网络输出流
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
ObjectOutputStream o1 = new ObjectOutputStream(socket.getOutputStream());
//PrintWriter out2=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//创建键盘输入流,以便客户端从键盘上输入信息
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入待发送的数据:");
String str=stdin.readLine(); //从键盘读入待发送的数据
String str2;//存校验码
MyDigest MD = new MyDigest();
MD.getDigest("SHA-1");
str2 = MD.toDigestString(str, "SHA-1");
System.out.println("校验码是:"+str2);

byte[] cipher = DES.encrypt(str);

out.println(str); //通过网络传送字符到服务器
out.println(str2);//传送校验信息到服务器
//System.out.println("test:"+cipher);
o1.writeObject(cipher);//传送加密信息到服务器

//System.out.println(cipher);
/*为了演示,把明文和密文都通过网络传输,实际只传密文,密钥通过保密信道单独传输*/

str=in.readLine();//从网络输入流读取结果
System.out.println( "从服务器接收到的结果为:"+str); //输出服务器返回的结果
}
catch (Exception e)
{
System.out.println(e);
}
}

}

服务器代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package server;

/**
*
* @author RockStone
*/
// file name:ComputeTCPServer.java
import java.net.*;
import java.io.*;
public class Main
{
public static void main(String srgs[])
{
ServerSocket sc = null;
Socket socket=null;
try
{
sc= new ServerSocket(8002);//创建服务器套接字
System.out.println("端口号:" + sc.getLocalPort());
System.out.println("服务器已经启动...");
socket = sc.accept(); //等待客户端连接
System.out.println("已经建立连接");
//获得网络输入流对象的引用
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ObjectInputStream in1 = new ObjectInputStream(socket.getInputStream());
////获得网络输出流对象的引用
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
String aline=in.readLine();//读取客户端传送来的数据
String aline2 = in.readLine();//读校验码
byte[] C=(byte[])in1.readObject();//读密文

MyDigest MD = new MyDigest();
MyDigest.getDigest("SHA-1");
String MDresult = MyDigest.toDigestString(aline, "SHA-1");//校验
if(aline2.equals(MDresult))
{
System.out.println("信息传输正确");
System.out.println("校验信息是:"+MDresult);
}
else
System.out.println("效验码不一致!");

//服务器解密
testdes show = new testdes();
show.decryption(C);

System.out.println("从客户端接收到信息为:"+aline); //通过网络输出流返回结果给客户端
out.println(aline);
out.close();
in.close();
sc.close();
}
catch (Exception e)
{
System.out.println(e);
}

}

}

实验测试:

客户端:

服务器:

实验所遇问题和解决方法

Question 1. 两台电脑一直无法联通

一开始根本不知道如何将两台电脑进行这次实验。

答:使用对方电脑IP就行了。用一台电脑连接网络然后wifi给另一台电脑使用,然后再次连接两台电脑,终于连通成功了。

Question 2. 显示连通了之后,客户端向服务器发送消息,但是显示有异常。

答:将端口换了一个变成端口8080之后,再次连接发送消息,成功。

实验体会:

  本次实验让我明白了java不仅仅是单机“游戏”,也可以上升到网络层次,引起了我对JAVA极大的兴趣。在实验过程中,我明白怎样创建客户端和服务器,同时利用out.println()和in.readline()函数使其进行数据连接和传输。实验的难点在于如何对数据进行加解密,然后进行传输。本次实验收获很多。

Java实验四 TCP客户端和服务器的应用的更多相关文章

  1. Java实验四

    20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...

  2. 20165324 Java实验四 Android程序设计

    20165324 Java实验四 Android程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月1 ...

  3. [JAVA] Tcp客户端和服务器简单代码

    服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...

  4. Java实验四和实验五

    实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了 ...

  5. 《Java实验四》

    //实验4--附录一代码 public class PassValueTest { //静态代码块,类一加载就执行的部分. //所以运行这个程序会输出 class loding static { Sy ...

  6. Java网络编程(TCP客户端)

    TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...

  7. #20165323 Java实验四 Android程序设计

    一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:13:45 - 15:25 实验序号:实验 ...

  8. 20165326 java实验四

    20165326实验四-Android程序设计 一:Android Stuidio的安装测试 1.安装Android Stuidio 具体跟着教程走就行主要是配置的时候要选择下载SDK或手动配置,详细 ...

  9. 20165310 Java实验四 《Android程序设计》

    20165310 实验四 <Android程序设计> 第24章:初识Android 任务一:改写res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号 首 ...

随机推荐

  1. android文件存储位置切换

    最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...

  2. redis的简单安装配置

    一.简介 Redis是一种高级key-value数据库,数据可以持久化,支持的数据类型很丰富,有字符串,哈希,链表,集合和有序集合5种数据类型 Redis支持在服务器端计算集合的并,交和补集(diff ...

  3. ubuntu不能访问windows中的文件

    出现不能访问某个盘时(例如:OS) Error mounting /dev/sda5 at /media/user/OS: Command-line `mount -t "ntfs" ...

  4. Java异常处理和设计【转】

    Java异常处理和设计 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常 ...

  5. statement和preparedstatement用法区别

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.   2.作为 ...

  6. 利用Keydown事件阻止用户输入

    先了解下各事件的区别 keydown:在控件有焦点的情况下按下键时发生 keypress:在控件有焦点的情况下按下键时发生 keyup:   在控件有焦点的情况下释放键时发生 意义 keypress主 ...

  7. 纯CSS3制作学生入学档案表单样式代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. [转]jQuery Popup Login and Contact Form

    本文转自:http://www.formget.com/jquery-popup-form/ Pop up forms are the smart way to present your site. ...

  9. 2014 Super Training #4 B Problem Arrangement --状压DP

    原题:ZOJ 3777  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:给每个题目安排在每个位置的value ...

  10. 第13章 Windows内存体系结构

    13.1 Windows的虚拟地址空间安排 13.1.1虚拟地址空间的分区(即虚拟地址空间布局) 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Window ...