java实现凯撒加密聊天CS版
一个小小练习,java语言编写的,Swing图形用户界面,Socket网络编程,与凯撒加密的结合,实现了加密聊天的功能。具体代码如下:
服务器端:
MyServer.java
/**
* 带有界面的全双工网络通信
*/
package com.nwsuaf.test3;
import javax.swing.*;
import sun.text.resources.BreakIteratorInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class MyServer extends JFrame implements ActionListener{
//界面设计
JPanel jp_faSong=null;
JPanel jp_jieShou=null;
JLabel jl_jiaMi1=null;
JLabel jl_jiaMi2=null;
JLabel jl_mingWen=null;
JLabel jl_miWen=null;
JTextField jtf_miYao1=null;
JTextField jtf_miYao2=null;
JTextField jtf_mingWen=null;
JTextField jtf_miWen=null;
JButton jb_jiaMiFaSong=null;
JButton jb_jieMiShuChu=null;
JTextArea jta_show=null;
JScrollPane jsp_show=null;
//把信息发给客户端的对象
PrintWriter pw=null;
public static void main(String[] args) {
MyServer myServer=new MyServer();
}
public MyServer() {
jp_faSong=new JPanel();
jp_jieShou=new JPanel();
jl_jiaMi1=new JLabel("密钥:");
jl_jiaMi2=new JLabel("密钥:");
jl_mingWen=new JLabel("明文:");
jl_miWen=new JLabel("密文:");
jtf_miYao1=new JTextField(5);
jtf_miYao2=new JTextField(5);
jtf_mingWen=new JTextField(10);
jtf_miWen=new JTextField(10);
jtf_miWen.setEditable(false);
jb_jiaMiFaSong=new JButton("加密发送");
jb_jiaMiFaSong.addActionListener(this);//加密发送监听器
jb_jiaMiFaSong.setActionCommand("jiaMiFaSong");
jb_jieMiShuChu=new JButton("解密输出");
jb_jieMiShuChu.addActionListener(this);//解密输出监听器
jb_jieMiShuChu.setActionCommand("jieMiShuChu");
jta_show=new JTextArea();
jsp_show=new JScrollPane(jta_show);
//添加组件
jp_jieShou.add(jl_jiaMi1);
jp_jieShou.add(jtf_miYao1);
jp_jieShou.add(jl_miWen);
jp_jieShou.add(jtf_miWen);
jp_jieShou.add(jb_jieMiShuChu);
jp_faSong.add(jl_jiaMi2);
jp_faSong.add(jtf_miYao2);
jp_faSong.add(jl_mingWen);
jp_faSong.add(jtf_mingWen);
jp_faSong.add(jb_jiaMiFaSong);
this.add(jp_jieShou,"North");
this.add(jsp_show);
this.add(jp_faSong,"South");
this.setTitle("QQ加密聊天-Server端");
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
//服务器监听
ServerSocket ss=new ServerSocket(9988);
//等待连接
Socket s=ss.accept();
//从客户端接收信息的流
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
//读取从客户端发来的信息
while (true) {
// 不停的读服务器端发来的信息
String info = br.readLine();
jtf_miWen.setText(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 事件实现过程
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("jiaMiFaSong")) {
// 加密发送实现过程
String info = jtf_mingWen.getText();
// 把服务器发送的信息显示到jta_show
jta_show.append("服务器对客户端说:" + info + "\r\n");
String infoMiWen = Caesar(info, 1);
pw.println(infoMiWen);
// 发送后清空 文本框内容
jtf_mingWen.setText("");
jtf_miYao2.setText("");
} else if (e.getActionCommand().equals("jieMiShuChu")) {
// 解密输出实现过程
String info2 = jtf_miWen.getText();
// 解密算法,返回解密后的值,并追加显示在文本域中
String infoMingWen = Caesar(info2, 0);
jta_show.append("客户端对服务器说:" + infoMingWen + "\r\n");
// 输出后清空文本框内容
jtf_miWen.setText("");
jtf_miYao1.setText("");
} else {
// 程序出错
System.out.println("程序出错!");
}
}
// flag=0代表解密,flag=1代表加密
private String Caesar(String s, int flag) {
String skey = null;
if (flag == 1) {
skey = jtf_miYao2.getText();
} else {
skey = jtf_miYao1.getText();
}
int key = Integer.parseInt(skey);
String es = "";
// 取出字符串中的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'a') {
c += 26;
}
if (c > 'z') {
c -= 26;
}
} else if (c >= 'A' && c <= 'Z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'A') {
c += 26;
}
if (c > 'Z') {
c -= 26;
}
}else if (c>='0'&&c<='9') {
if (flag == 1) {
c += key % 10;// 加密
} else {
c -= key % 10;// 解密
}
if (c < '0') {
c += 10;
}
if (c > '9') {
c -= 10;
}
}else{
//c=c;
}
es += c;
}
return es;
}
}
* 带有界面的全双工网络通信
*/
package com.nwsuaf.test3;
import javax.swing.*;
import sun.text.resources.BreakIteratorInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class MyServer extends JFrame implements ActionListener{
//界面设计
JPanel jp_faSong=null;
JPanel jp_jieShou=null;
JLabel jl_jiaMi1=null;
JLabel jl_jiaMi2=null;
JLabel jl_mingWen=null;
JLabel jl_miWen=null;
JTextField jtf_miYao1=null;
JTextField jtf_miYao2=null;
JTextField jtf_mingWen=null;
JTextField jtf_miWen=null;
JButton jb_jiaMiFaSong=null;
JButton jb_jieMiShuChu=null;
JTextArea jta_show=null;
JScrollPane jsp_show=null;
//把信息发给客户端的对象
PrintWriter pw=null;
public static void main(String[] args) {
MyServer myServer=new MyServer();
}
public MyServer() {
jp_faSong=new JPanel();
jp_jieShou=new JPanel();
jl_jiaMi1=new JLabel("密钥:");
jl_jiaMi2=new JLabel("密钥:");
jl_mingWen=new JLabel("明文:");
jl_miWen=new JLabel("密文:");
jtf_miYao1=new JTextField(5);
jtf_miYao2=new JTextField(5);
jtf_mingWen=new JTextField(10);
jtf_miWen=new JTextField(10);
jtf_miWen.setEditable(false);
jb_jiaMiFaSong=new JButton("加密发送");
jb_jiaMiFaSong.addActionListener(this);//加密发送监听器
jb_jiaMiFaSong.setActionCommand("jiaMiFaSong");
jb_jieMiShuChu=new JButton("解密输出");
jb_jieMiShuChu.addActionListener(this);//解密输出监听器
jb_jieMiShuChu.setActionCommand("jieMiShuChu");
jta_show=new JTextArea();
jsp_show=new JScrollPane(jta_show);
//添加组件
jp_jieShou.add(jl_jiaMi1);
jp_jieShou.add(jtf_miYao1);
jp_jieShou.add(jl_miWen);
jp_jieShou.add(jtf_miWen);
jp_jieShou.add(jb_jieMiShuChu);
jp_faSong.add(jl_jiaMi2);
jp_faSong.add(jtf_miYao2);
jp_faSong.add(jl_mingWen);
jp_faSong.add(jtf_mingWen);
jp_faSong.add(jb_jiaMiFaSong);
this.add(jp_jieShou,"North");
this.add(jsp_show);
this.add(jp_faSong,"South");
this.setTitle("QQ加密聊天-Server端");
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
//服务器监听
ServerSocket ss=new ServerSocket(9988);
//等待连接
Socket s=ss.accept();
//从客户端接收信息的流
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
//读取从客户端发来的信息
while (true) {
// 不停的读服务器端发来的信息
String info = br.readLine();
jtf_miWen.setText(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 事件实现过程
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("jiaMiFaSong")) {
// 加密发送实现过程
String info = jtf_mingWen.getText();
// 把服务器发送的信息显示到jta_show
jta_show.append("服务器对客户端说:" + info + "\r\n");
String infoMiWen = Caesar(info, 1);
pw.println(infoMiWen);
// 发送后清空 文本框内容
jtf_mingWen.setText("");
jtf_miYao2.setText("");
} else if (e.getActionCommand().equals("jieMiShuChu")) {
// 解密输出实现过程
String info2 = jtf_miWen.getText();
// 解密算法,返回解密后的值,并追加显示在文本域中
String infoMingWen = Caesar(info2, 0);
jta_show.append("客户端对服务器说:" + infoMingWen + "\r\n");
// 输出后清空文本框内容
jtf_miWen.setText("");
jtf_miYao1.setText("");
} else {
// 程序出错
System.out.println("程序出错!");
}
}
// flag=0代表解密,flag=1代表加密
private String Caesar(String s, int flag) {
String skey = null;
if (flag == 1) {
skey = jtf_miYao2.getText();
} else {
skey = jtf_miYao1.getText();
}
int key = Integer.parseInt(skey);
String es = "";
// 取出字符串中的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'a') {
c += 26;
}
if (c > 'z') {
c -= 26;
}
} else if (c >= 'A' && c <= 'Z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'A') {
c += 26;
}
if (c > 'Z') {
c -= 26;
}
}else if (c>='0'&&c<='9') {
if (flag == 1) {
c += key % 10;// 加密
} else {
c -= key % 10;// 解密
}
if (c < '0') {
c += 10;
}
if (c > '9') {
c -= 10;
}
}else{
//c=c;
}
es += c;
}
return es;
}
}
客户端:
MyClient.java
/**
* 带有界面的全双工网络通信,必须客户端先说话
*/
package com.nwsuaf.test3;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class MyClient extends JFrame implements ActionListener {
// 界面设计
JPanel jp_faSong = null;
JPanel jp_jieShou = null;
JLabel jl_jiaMi1 = null;
JLabel jl_jiaMi2 = null;
JLabel jl_mingWen = null;
JLabel jl_miWen = null;
JTextField jtf_miYao1 = null;
JTextField jtf_miYao2 = null;
JTextField jtf_mingWen = null;
JTextField jtf_miWen = null;
JButton jb_jiaMiFaSong = null;
JButton jb_jieMiShuChu = null;
JTextArea jta_show = null;
JScrollPane jsp_show = null;
// 传递数据
PrintWriter pw = null;
public static void main(String[] args) {
MyClient myClient = new MyClient();
}
public MyClient() {
jp_faSong = new JPanel();
jp_jieShou = new JPanel();
jl_jiaMi1 = new JLabel("密钥:");
jl_jiaMi2 = new JLabel("密钥:");
jl_mingWen = new JLabel("明文:");
jl_miWen = new JLabel("密文:");
jtf_miYao1 = new JTextField(5);
jtf_miYao2 = new JTextField(5);
jtf_mingWen = new JTextField(10);
jtf_miWen = new JTextField(10);
jtf_miWen.setEditable(false);
jb_jiaMiFaSong = new JButton("加密发送");
jb_jiaMiFaSong.addActionListener(this);// 加密发送监听器
jb_jiaMiFaSong.setActionCommand("jiaMiFaSong");
jb_jieMiShuChu = new JButton("解密输出");
jb_jieMiShuChu.addActionListener(this);// 解密输出监听器
jb_jieMiShuChu.setActionCommand("jieMiShuChu");
jta_show = new JTextArea();
jsp_show = new JScrollPane(jta_show);
// 添加组件
jp_jieShou.add(jl_jiaMi1);
jp_jieShou.add(jtf_miYao1);
jp_jieShou.add(jl_miWen);
jp_jieShou.add(jtf_miWen);
jp_jieShou.add(jb_jieMiShuChu);
jp_faSong.add(jl_jiaMi2);
jp_faSong.add(jtf_miYao2);
jp_faSong.add(jl_mingWen);
jp_faSong.add(jtf_mingWen);
jp_faSong.add(jb_jiaMiFaSong);
this.add(jp_jieShou, "North");
this.add(jsp_show);
this.add(jp_faSong, "South");
this.setTitle("QQ加密聊天-Client端");
this.setSize(400, 300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// 网络传输
try {
Socket s = new Socket("127.0.0.1", 9988);
// 接收服务器端发来的信息流
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
// 发送想服务器端发送客户端数据的流
pw = new PrintWriter(s.getOutputStream(), true);
while (true) {
// 不停的读服务器端发来的信息
String info = br.readLine();
jtf_miWen.setText(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 事件实现过程
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("jiaMiFaSong")) {
// 加密发送实现过程
String info = jtf_mingWen.getText();
// 把客户端发送的信息显示到jta_show
jta_show.append("客户端对服务器说:" + info + "\r\n");
String infoMiWen = Caesar(info, 1);
pw.println(infoMiWen);
// 发送后清空文本框内容
jtf_mingWen.setText("");
jtf_miYao2.setText("");
} else if (e.getActionCommand().equals("jieMiShuChu")) {
// 解密输出实现过程
String info2 = jtf_miWen.getText();
// 解密算法,返回解密后的值,并追加显示在文本域中
String infoMingWen = Caesar(info2, 0);
jta_show.append("服务器对客户端说:" + infoMingWen + "\r\n");
// 输出后清空文本框内容
jtf_miWen.setText("");
jtf_miYao1.setText("");
} else {
// 程序出错
System.out.println("程序出错!");
}
}
// flag=0代表解密,flag=1代表加密
private String Caesar(String s, int flag) {
String skey = null;
if (flag == 1) {
skey = jtf_miYao2.getText();
} else {
skey = jtf_miYao1.getText();
}
int key = Integer.parseInt(skey);
String es = "";
// 取出字符串中的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'a') {
c += 26;
}
if (c > 'z') {
c -= 26;
}
} else if (c >= 'A' && c <= 'Z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'A') {
c += 26;
}
if (c > 'Z') {
c -= 26;
}
}else if (c>='0'&&c<='9') {
if (flag == 1) {
c += key % 10;// 加密
} else {
c -= key % 10;// 解密
}
if (c < '0') {
c += 10;
}
if (c > '9') {
c -= 10;
}
}else{
//c=c;
}
es += c;
}
return es;
}
}
* 带有界面的全双工网络通信,必须客户端先说话
*/
package com.nwsuaf.test3;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class MyClient extends JFrame implements ActionListener {
// 界面设计
JPanel jp_faSong = null;
JPanel jp_jieShou = null;
JLabel jl_jiaMi1 = null;
JLabel jl_jiaMi2 = null;
JLabel jl_mingWen = null;
JLabel jl_miWen = null;
JTextField jtf_miYao1 = null;
JTextField jtf_miYao2 = null;
JTextField jtf_mingWen = null;
JTextField jtf_miWen = null;
JButton jb_jiaMiFaSong = null;
JButton jb_jieMiShuChu = null;
JTextArea jta_show = null;
JScrollPane jsp_show = null;
// 传递数据
PrintWriter pw = null;
public static void main(String[] args) {
MyClient myClient = new MyClient();
}
public MyClient() {
jp_faSong = new JPanel();
jp_jieShou = new JPanel();
jl_jiaMi1 = new JLabel("密钥:");
jl_jiaMi2 = new JLabel("密钥:");
jl_mingWen = new JLabel("明文:");
jl_miWen = new JLabel("密文:");
jtf_miYao1 = new JTextField(5);
jtf_miYao2 = new JTextField(5);
jtf_mingWen = new JTextField(10);
jtf_miWen = new JTextField(10);
jtf_miWen.setEditable(false);
jb_jiaMiFaSong = new JButton("加密发送");
jb_jiaMiFaSong.addActionListener(this);// 加密发送监听器
jb_jiaMiFaSong.setActionCommand("jiaMiFaSong");
jb_jieMiShuChu = new JButton("解密输出");
jb_jieMiShuChu.addActionListener(this);// 解密输出监听器
jb_jieMiShuChu.setActionCommand("jieMiShuChu");
jta_show = new JTextArea();
jsp_show = new JScrollPane(jta_show);
// 添加组件
jp_jieShou.add(jl_jiaMi1);
jp_jieShou.add(jtf_miYao1);
jp_jieShou.add(jl_miWen);
jp_jieShou.add(jtf_miWen);
jp_jieShou.add(jb_jieMiShuChu);
jp_faSong.add(jl_jiaMi2);
jp_faSong.add(jtf_miYao2);
jp_faSong.add(jl_mingWen);
jp_faSong.add(jtf_mingWen);
jp_faSong.add(jb_jiaMiFaSong);
this.add(jp_jieShou, "North");
this.add(jsp_show);
this.add(jp_faSong, "South");
this.setTitle("QQ加密聊天-Client端");
this.setSize(400, 300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// 网络传输
try {
Socket s = new Socket("127.0.0.1", 9988);
// 接收服务器端发来的信息流
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
// 发送想服务器端发送客户端数据的流
pw = new PrintWriter(s.getOutputStream(), true);
while (true) {
// 不停的读服务器端发来的信息
String info = br.readLine();
jtf_miWen.setText(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 事件实现过程
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("jiaMiFaSong")) {
// 加密发送实现过程
String info = jtf_mingWen.getText();
// 把客户端发送的信息显示到jta_show
jta_show.append("客户端对服务器说:" + info + "\r\n");
String infoMiWen = Caesar(info, 1);
pw.println(infoMiWen);
// 发送后清空文本框内容
jtf_mingWen.setText("");
jtf_miYao2.setText("");
} else if (e.getActionCommand().equals("jieMiShuChu")) {
// 解密输出实现过程
String info2 = jtf_miWen.getText();
// 解密算法,返回解密后的值,并追加显示在文本域中
String infoMingWen = Caesar(info2, 0);
jta_show.append("服务器对客户端说:" + infoMingWen + "\r\n");
// 输出后清空文本框内容
jtf_miWen.setText("");
jtf_miYao1.setText("");
} else {
// 程序出错
System.out.println("程序出错!");
}
}
// flag=0代表解密,flag=1代表加密
private String Caesar(String s, int flag) {
String skey = null;
if (flag == 1) {
skey = jtf_miYao2.getText();
} else {
skey = jtf_miYao1.getText();
}
int key = Integer.parseInt(skey);
String es = "";
// 取出字符串中的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'a') {
c += 26;
}
if (c > 'z') {
c -= 26;
}
} else if (c >= 'A' && c <= 'Z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'A') {
c += 26;
}
if (c > 'Z') {
c -= 26;
}
}else if (c>='0'&&c<='9') {
if (flag == 1) {
c += key % 10;// 加密
} else {
c -= key % 10;// 解密
}
if (c < '0') {
c += 10;
}
if (c > '9') {
c -= 10;
}
}else{
//c=c;
}
es += c;
}
return es;
}
}