2022年07月01日讲到了使用TCP进行通讯 同学们
今天写一个低配版机器人聊天系统
这是个叫TCPServer的类
package com.langsin.TCPChat;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
public class TCPServer {
private static SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String getTime(){
Date date=new Date();
String time=dateFormat.format(date);
return time;
}
// TCP服务端 相当于智能机器人
public static void main(String[] args) {
try {
List<String> checkList = new ArrayList<>();
Scanner scanner = new Scanner(new File("./file/chat.txt"));
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
checkList.add(line);
}
scanner.close();
ArrayList<String> overList = new ArrayList<>();
overList.add("886");
overList.add("再见");
overList.add("回聊");
overList.add("下次再聊");
overList.add("走了");
// ServerSocket是TCP的直接套接字实现类,客户端就是与这个对象建立连接通道
ServerSocket server = new ServerSocket(8000);
System.out.println("服务已启动...........");
// 客户端与服务端的Socket形成一对关系
Socket socket = server.accept();
// 就是通过Socket中的IO流实现信息传递
// 客户端关闭之前 先给服务端发送一段结束信息 服务端接收后关闭socket 不再接收信息
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
// 所以 服务端的操作就是读取 读取后进行判断 然后进行输出
// input是字节流 InputStream是转换为字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
PrintWriter writer = new PrintWriter(output);
while (true) {
// 先读取客户端发送过来的一行数据
String line = reader.readLine();
// 如果读取不到数据 则程序会阻塞在这里
boolean flag=false;
for (String content : overList) {
if (line.contains(content)){
flag=true;
break;
}
}
if (flag){
break;
}
if (line.contains("吃") && (line.contains("东西") || line.contains("什么"))) {
writer.println(checkList.get(0));
} else if (line.contains("跟我") && line.contains("看电影")) {
writer.println(checkList.get(1));
} else if (line.contains("好看") && line.contains("电影")) {
writer.println(checkList.get(3));
} else if (line.contains("我") && (line.contains("帅不帅") || line.contains("很帅"))) {
writer.println(checkList.get(5));
} else if ((line.contains("我") || line.contains("姐姐")) && line.contains("漂亮 ")) {
writer.println(checkList.get(6));
} else if (line.contains("你") && (line.contains("笨") || line.contains("丑")
)|| line.contains("傻")|| line.contains("草")) {
writer.println(checkList.get(4));
}else if(line.contains("纯正")){
writer.println(checkList.get(7));
}else {
writer.println(checkList.get(2));
}
writer.flush();
}
// 服务端关闭socket
socket.close();
writer.println("智能 机器人 小艾 走了");
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是个叫TCPChat的类
package com.langsin.TCPChat;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class TCPChat {
// 这是我们的聊天窗口类
// 在JAVA的界面应用开发中 主要使用java.awt.* java.swing.* 这两个包下面的类
private static SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String getTime(){
Date date=new Date();
String time=dateFormat.format(date);
return time;
}
BufferedReader reader=null;
PrintWriter writer=null;
public TCPChat() {
Socket socket=null;
try {
// 首先要与服务端建立连接
// 这是客户端的socket套接字
socket = new Socket("192.168.43.92",8000);
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
// 建立一个窗口
JFrame frame=new JFrame("TCP聊天窗口");
frame.setSize(800,600);
// 设置窗口不可拉伸
frame.setResizable(false);
// 设置窗口在中间出现
frame.setLocationRelativeTo(null);
// 使用绝对布局 放入组件时需要确定组件的位置
frame.setLayout(null);
// 加一个文本域
JTextArea show = new JTextArea();
// 设置文本域的字体
Font font = new Font("楷体",Font.PLAIN,25);
show.setFont(font);
// 设置文本域只能读 不能改
show.setEditable(false);
// 加一个滚动条
JScrollPane pane = new JScrollPane(show,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// 这里请不要把pane设置得和界面一样宽 留一点给滚动条
pane.setBounds(0,0,785,400);
frame.add(pane);
// 创建一个按钮
JButton close=new JButton("关闭");
close.setBounds(600,520,80,30);
JButton send=new JButton("发送");
send.setBounds(700,520,80,30);
Font btnFont = new Font("微软雅黑",Font.PLAIN,17);
close.setFont(btnFont);
send.setFont(btnFont);
// 这个文本域用于输入
JTextArea input = new JTextArea();
input.setBounds(0,410,794,100);
input.setBorder(BorderFactory.createLineBorder(Color.black));
input.setFont(btnFont);
frame.add(input);
frame.add(close);
frame.add(send);
// 如果需要给按钮添加功能 就需要加点击事件监听器
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {// 事件对象
ArrayList<String> list = new ArrayList<>();
// 点击发送按钮后 发给服务器内容 然后再读一个内容
String msg=input.getText();
input.setText("");
show.append("用户"+TCPServer.getTime()+":\n"+msg+"\n");
// 把内容发送给服务端
try {
writer.println(msg);
writer.flush();
String line=reader.readLine();
show.append("小艾说"+getTime()+":\n"+line+"\n");
} catch (Exception exception) {
exception.printStackTrace();
}
}
});
// 加上这个方法 窗口才能显示出来
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) throws Exception{
new TCPChat();
}
}
然后在一个叫file的文件夹下新建一个叫chat.txt的文件
里面放上小艾要说的东西
小艾是机器人,小艾不吃东西,可是小艾也想知道食物的关味! 小艾也很喜欢看电影,小艾也很喜欢跟你一起看电影呢! 你能不能说得清楚一点?小艾看不懂. 小艾最近也没有关注过,不能给你很好的提示. 小艾很生气,小艾不理你了! 你是天下第一帅!小艾好喜欢你啊! 姐姐你也很漂亮,可是再要亮有什么用?又没有男朋友. 来点儿纯正的味儿 1966座头市 偶尔也有坏习惯 我爱拿生命做投掷!
然后先打开TCPServer再打开TCPChat
就可以出现聊天窗口了
然后就实现了一个有点蠢的机器人聊天系统