Java TCP、IO流实现简单机器人聊天系统

Java TCP、IO流实现简单聊天机器人系统


一、效果:

        c.png


    (此系统基于java TCP信息传递,IO流实现人机聊天互动功能,词库可以自己加。)


二、主要知识点:

1、java.net
     类 Socket

    java.lang.Object    
      java.net.Socket

            此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

protectedSocket()通过系统默认类型的 SocketImpl 创建未连接套接字

protected

Socket(InetAddress address, int port)  创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
 InputStreamgetInputStream()   返回此套接字的输入流。

 OutputStreamgetOutputStream() 返回此套接字的输出流。
 voidclose()关闭此套接字。

2、java.net
     类 ServerSocket

        此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

    java.lang.Object
      java.net.ServerSocket

 Socketaccept() 侦听并接受到此套接字的连接。
 voidclose() 关闭此套接字。

3、java.io
     类 OutputStream

    java.lang.Object
      java.io.OutputStream

        此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。

voidwrite(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
voidclose()关闭此输出流并释放与此流有关的所有系统资源。

4、java.io
     类 InputStream

    java.lang.Object

          java.io.InputStream

         此抽象类是表示字节输入流的所有类的超类。

 intread(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
voidclose() 关闭此输入流并释放与该流关联的所有系统资源。

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 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

 

构造方法摘要
BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

方法摘要
 intread(byte[] b)从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中。
 voidclose() 关闭此输入流并释放与该流关联的所有系统资源。

三、包和词库:

        图片.png

    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();//服务器一直循环,不停止
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章