java客户端实验_Java实验四 TCP客户端和服务器的应用

本文介绍了如何使用Java实现TCP客户端和服务器之间的安全通信,包括使用DES加密、RSA加密以及SHA-1摘要计算进行信息验证。实验步骤详细展示了客户端发送加密信息和服务器接收解密信息的过程,并提供了遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

实验内容

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);

}

}

}

实验测试:

客户端:

21c1e76084f67e4079a5b03d6cdc2e67.png

服务器:

8484d054ac1a5a69200a7481c06a6abd.png

实验所遇问题和解决方法

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

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

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

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

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

实验体会:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值