Java TCP、IO流实现简单聊天机器人系统
(此系统基于java TCP信息传递,IO流实现人机聊天互动功能,词库可以自己加。)
二、主要知识点:
1、java.net
类 Socket
java.lang.Object java.net.Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
protected | Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 |
| Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
InputStream | getInputStream() 返回此套接字的输入流。 |
OutputStream | getOutputStream() 返回此套接字的输出流。 |
void | close() 关闭此套接字。 |
2、java.net
类 ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
java.lang.Object java.net.ServerSocket
Socket | accept() 侦听并接受到此套接字的连接。 |
void | close() 关闭此套接字。 |
3、java.io
类 OutputStream
java.lang.Object java.io.OutputStream
此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
void | write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 |
void | close() 关闭此输出流并释放与此流有关的所有系统资源。 |
4、java.io
类 InputStream
java.lang.Object java.io.InputStream
此抽象类是表示字节输入流的所有类的超类。
int | read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 |
void | close() 关闭此输入流并释放与该流关联的所有系统资源。 |
5、String 类的 getBytes()方法
byte[] | getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
6、java.io
类 BufferedInputStream
java.lang.Object java.io.InputStream java.io.FilterInputStream java.io.BufferedInputStream
BufferedInputStream
为另一个输入流添加一些功能,即缓冲输入以及支持 mark
和 reset
方法的能力。在创建 BufferedInputStream
时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark
操作记录输入流中的某个点,reset
操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark
操作后读取的所有字节。
构造方法摘要 | |
---|---|
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in ,以便将来使用。 |
方法摘要 |
---|
int | read(byte[] b) 从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中。 |
void | close() 关闭此输入流并释放与该流关联的所有系统资源。 |
三、包和词库:
Chatbot.txt:词库文本(私信我发给你)
MsgEx.txt :聊天记录文本
四、代码:
1、 客户端:
package com.chatbot_TCP;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.util.Scanner;/* * Chatbot 客户端 * */public class ChatbotClient { public static void main(String[] args) throws IOException { System.out.println("欧巴你来了!"); boolean clientBL = true; while(clientBL){ //创建Socket对象 Socket server = new Socket(InetAddress.getLocalHost(),123); //获取通道中的输出流 OutputStream clientOS = server.getOutputStream(); String clientStr = new Scanner(System.in).nextLine(); clientOS.write(clientStr.getBytes()); //获取通道中的输入流 InputStream clientIS = server.getInputStream(); byte [] clientByte = new byte[1024]; int clientLen = clientIS.read(clientByte); System.out.println("静儿:"+new String(clientByte,0,clientLen)); if("再见".equals(clientStr) || "over".equalsIgnoreCase(clientStr)){ clientBL = false; } clientIS.close(); clientOS.close(); } //server.close(); }}
2、服务器端
package com.chatbot_TCP;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;/* * Chatbot 服务器 */public class ChatbotServer { public static void main(String[] args) throws IOException { //创建ServerSocket对象 ServerSocket ss = new ServerSocket(123); boolean bl = true; while(bl){ //使用ss调用accept方法,获取哪个客户端 Socket client = ss.accept(); //获取用户的输出流 InputStream is = client.getInputStream(); //使用输出流对象的read方法,读取数据 byte[] bt = new byte[1024]; int len = is.read(bt); String clientStr = new String(bt,0,len); //获取通道中的输出流 OutputStream out = client.getOutputStream(); //创建输入流缓冲流 BufferedReader br = new BufferedReader(new FileReader("Chatbot.txt")); //创建输出流缓冲流 BufferedWriter bw = new BufferedWriter(new FileWriter("MsgEx.txt",true)); //DateFormat df = new SimpleDateFormat("HH:mm:ss"); //读取Chatbot.txt文本 String chatbot = null; boolean enen = true; while((chatbot = br.readLine())!=null){ String[] chatbotSplit = chatbot.split("-"); if(clientStr.equalsIgnoreCase(chatbotSplit[0])){ byte [] chatbotByte = chatbotSplit[1].getBytes(); out.write(chatbotByte); bw.write("我:"+clientStr); bw.newLine(); bw.write("静儿:"+chatbotSplit[1]); bw.newLine(); }else if("over".equalsIgnoreCase(clientStr) || "再见".equalsIgnoreCase(clientStr)){ out.write("欧巴再见".length()); bw.write("我:"+clientStr); bw.write("静儿:欧巴再见"); bw.newLine(); bl = false; }else if("聊天记录".equals(clientStr) || "查看聊天".equals(clientStr)){ BufferedInputStream bisMsgEx = new BufferedInputStream(new FileInputStream("MsgEx.txt")); OutputStream clientOut = client.getOutputStream(); int lenMsgEx = 0; byte [] byteMsgEx = new byte[1024]; while((lenMsgEx = bisMsgEx.read(byteMsgEx))!=-1){ clientOut.write(byteMsgEx,0,lenMsgEx); } }else{ enen = false; } } if(!enen){ out.write("爱你哟".getBytes()); bw.write("静儿:爱你哟"); bw.newLine(); } //释放资源 bw.close(); br.close(); out.close(); is.close(); client.close(); } //ss.close();//服务器一直循环,不停止 }}
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦