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();//服务器一直循环,不停止
}
}
转载于:https://blog.51cto.com/9243237/2106363