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

news/2024/7/5 6:40:12

实验内容

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()函数使其进行数据连接和传输。实验的难点在于如何对数据进行加解密,然后进行传输。本次实验收获很多。

转载于:https://www.cnblogs.com/tuwenbin/p/4570591.html


http://www.niftyadmin.cn/n/1944135.html

相关文章

java经典50行_求一个50行左右的JAVA代码,最好每行带注释,谢谢啦

匿名用户1级2017-03-30 回答展开全部/*这个相当详细了.程序也不算太难.而且给老师看的时候效果比较好.因为有图形化界面,又实现一个比较实用的功能.老师会比较高兴的.建立一个文件名为Change.java就可以编译了*//** 这个程序实现输入身高算出标准体重,输入体重,算出身高的功能*…

前端的第二十六天(初识AJAX、客户端和服务器、网络相关概念、通信协议、服务器环境的安装、网站、PHP基础语法)

一、初识AJAX 1.url地址 展示网页 、提供数据 2.异步刷新 避免整个界面刷新,加载更快、省流量 3.同步刷新 不影响当前界面现有的操作 二、客户端与服务器 一般情况下服务器的硬件配置都要高一些,因为访问量大的话容易宕机。 像淘宝双11的时候&a…

在一个页面修改数据,并且ajax刷新数据列表的数据实现。

最近做layui框架发现用别人封装好的东西总是无法满足我想要的效果。于是决定自己重新写。 今天讲分页 我这里将数据增删改查分成了4个页面&#xff0c;各个页面之间相互关联。 1.add 添加页 2.ajaxlist 采用ajax方式分页的数据页 3.edit修改页 4.volist主页 主页信息volist <…

系统地图的用法

1, 引用框架 CoreGraphics.framework MapKit.framework CoreLocation.framework2 导入主头文件 iOS5之后不需要手动导入#import <CoreLocation/CoreLocation.h>#import <MapKit/MapKit.h>&#xff08;1&#xff09;MapKit &#xff1a;用于地图展示&#xf…

find / -name *.py | xargs grep domain | wc -l

http://world77.blog.51cto.com/414605/209125 http://blog.csdn.net/windone0109/article/details/2817792 查找目录&#xff1a;find /&#xff08;查找范围&#xff09; -name 查找关键字 -type d查找文件&#xff1a;find /&#xff08;查找范围&#xff09; -name 查找关键…

Fiddler学习基础(一)

Fiddler官方网站及下载地址&#xff1a;http://www.telerik.com/fiddler 1. Fiddler原理&#xff1a; 作为系统代理&#xff0c;所有的来自微软互联网服务&#xff08;WinInet&#xff09;的http请求再到达目标Web服务器的之前都会经过Fiddler&#xff0c;同样的&#xff0c;所…

Nginx 代理配置

nginx 正向http代理配置 需要用户名和密码认证 生成密码文件&#xff1a; linux需要安装&#xff1a; #yum -y install httpd-tools生成密码文件&#xff1a; #htpasswd -c /usr/local/nginx/conf/pwd/passwd 用户名输入密码重新输入密码 server配置&#xff1a; 在conf的目录下…

mysql日期排序YMD_MySQL datetime字段查询按小时:分钟排序

我有这样一张桌子&#xff1a;id date_time1 2/11/2013 7:052 2/11/2013 7:003 2/12/2013 7:004 2/14/2013 7:005 2/16/2013 7:006 2/17/2013 7:007 2/12/2013 7:058 2/14/2013 7:059 2/15/2013 7:0510 2/16/2013 7:0511 2/17/2013 7:0512 2/13/2013 7:0013 2/15/2013 7:0014 2…