Java实验四 TCP客户端和服务器的应用
实验内容
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客户端和服务器的应用的更多相关文章
- Java实验四
20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...
- 20165324 Java实验四 Android程序设计
20165324 Java实验四 Android程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月1 ...
- [JAVA] Tcp客户端和服务器简单代码
服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...
- Java实验四和实验五
实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1. 掌握OOP方式进行程序设计的方法, 2. 了 ...
- 《Java实验四》
//实验4--附录一代码 public class PassValueTest { //静态代码块,类一加载就执行的部分. //所以运行这个程序会输出 class loding static { Sy ...
- Java网络编程(TCP客户端)
TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...
- #20165323 Java实验四 Android程序设计
一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:13:45 - 15:25 实验序号:实验 ...
- 20165326 java实验四
20165326实验四-Android程序设计 一:Android Stuidio的安装测试 1.安装Android Stuidio 具体跟着教程走就行主要是配置的时候要选择下载SDK或手动配置,详细 ...
- 20165310 Java实验四 《Android程序设计》
20165310 实验四 <Android程序设计> 第24章:初识Android 任务一:改写res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号 首 ...
随机推荐
- java基础--温故而知新 (01)
1 myeclipse是一个eclipse插件.使用java语言开发.进程是javaw.exe--非命令行方式启动. 2 考这些术语的公司,往往都是世界一流的好公司.(技术广度+英语) java ...
- TCP 连接的 TIME_WAIT 过多 导致 Tomcat 假死
最近系统二次开发之后,发现使用的 Tomcat 7 会经常假死.前端点击页面无任何反应,打开firebug,很多链接一直在等待服务器的反应.查看服务器的状态,CPU占用很少,最多不超过10%,一般只有 ...
- CSS元素类型
前面有一篇文章讲到在css世界中,html元素的表现都是一个个盒子,而css中盒子的显示方式有三种方式,分别是块元素.行内元素和行内块元素.本文总结这三种显示方式的特征和区别. 1 写在前面 最近在整 ...
- 烂泥:ubuntu安装vmtools
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近由于工作需要,需要使用桌面版的linux系统,所以就选择了ubuntu.同时为了方便使用,就在VM中安装ubuntu. 但是为了文件以及操作的方便就 ...
- visual studio 2013 快捷键大全
1.回到上一个光标位置/前进到下一个光标位置 1)回到上一个光标位置:使用组合键“Ctrl + -”: 2)前进到下一个光标位置:“Ctrl + Shift + - ”. 2.复制/剪切/删除整行代码 ...
- 1.NopCommerce下载与安装
NoCommerce是基于微软ASP.NET MVC + EntityFramework 技术开发的一套开源电子商城系统,其架构与设计非常精妙被誉为.NET商城的经典之作. 作为一个.NET程序爱好者 ...
- 什么办法可以替代distinct
今天在论坛上看到一个面试题,是说有什么办法可以替代distinct,得到同样的结果.答案都被大家说的差不多了,发现挺有意思的,就记录一下: SQL> select num from t1; ...
- Hadoop_HDFS文件读写代码流程解析和副本存放机制
Hadoop学习笔记总结 01.RPC(远程过程调用) 1. RPC概念 远程过程指的不是同一个进程的调用.它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 不能直接拿到远 ...
- hdu1710(二叉树的历遍)
/* Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- ZBrush中的笔刷该怎样制作
ZBrush给用户提供了许多的常用笔刷,我们可以使用这些笔刷自由地发挥创意.为了让雕刻速度更快,模型刻画更细致我们常常也会创建自定义笔刷,本文教您在ZBrush中制作笔刷. 查看更多内容请直接前往:h ...