网络编程之图灵机器人
智能聊天功能
建立线程,加入fastjson.jar架包,添加jar包build path -->add …
加好jar包,为什么要导jar包呢就是因为图灵机器人是json数据以post方式发送
一、ServerRunable 类
package com.chat;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class ServerRunable implements Runnable{
private Socket socket;
public ServerRunable(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
//客户端的信息
InetAddress inetAddress = socket.getInetAddress();
String ip = inetAddress.getHostAddress();
int port = socket.getPort();
while (true) {
//获取客户端的数据
String clientMsg =dataInputStream.readUTF();
System.out.println("客户端("+ip+":"+port+")"+clientMsg);
//应该给客户端回复数据了 但是把消息发送给图灵 让图灵代替服务端发送智能回复
//客户端-->服务端-->图灵机器人
HashMap< String, String> hashMap = new HashMap<>();
hashMap.put("key", "4128814986bb44e99d45059835b6c2b1");
hashMap.put("info", clientMsg);
//将集合转为字符串再转JSON
String jsonStr = JSON.toJSONString(hashMap);
//发起post请求 请求图灵机器人
String content = post("http://www.tuling123.com/openapi/api", jsonStr);
//将字符串转为JSON对象
JSONObject jsonObject = JSON.parseObject(content);
if(jsonObject.getIntValue("code")==100000) {
//图灵有返回数据
//发送给客户端
dataOutputStream.writeUTF(jsonObject.getString("text"));
}else {
System.out.println("服务器繁忙!");
}
//找个机会 结束循环
if(clientMsg.equals("end")) {
break;
}
}
//聊天结束
dataInputStream.close();
dataOutputStream.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装post请求
private String post(String path,String param) {
String result="";
try {
URL url = new URL(path);
URLConnection urlConnection = url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
//防止乱码
urlConnection.setRequestProperty("Content-Type", "application/json");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream()));
bufferedWriter.write(param);
bufferedWriter.flush();
bufferedWriter.close();
//--------
//接受图灵返回的数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line = null;
while((line = bufferedReader.readLine()) != null) {
result += line;
}
bufferedReader.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
进入别人得网站创建一个机器人如下所示
点创建的机器人下面有一个apikey
找到技能扩展,技能扩展下有个聊天点进去有个api使用看看
二、server 类
package com.chat;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(6677);
System.out.println("服务器已启动,等待客户端连接...");
//一对多 一个服务器对应多个客户端
//开辟缓存线程池
Executor cachedThreadPool = Executors.newCachedThreadPool();
while (true) {
//接受客户端的请求
Socket socket = serverSocket.accept();
System.out.println("已连接:"+socket);
//本该回复消息 但是我们已经在子线程中封装过回复消息的步骤了
ServerRunable serverRunable = new ServerRunable(socket);
cachedThreadPool.execute(serverRunable);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、 Client 类
package com.chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket socket =new Socket("127.0.0.1", 6677);
//安全判断
if (socket.isConnected()) {
System.out.println("连接到:"+socket);
}
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入:");
String content = scanner.next();
dataOutputStream.writeUTF(content);
//接受服务端发送的信息
String serverMsg = dataInputStream.readUTF();
System.out.println("服务端说:"+serverMsg);
if (serverMsg.equals("走你")) {
break;
}
}
dataInputStream.close();
dataOutputStream.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}