本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
10分39秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 步骤 1 : 建立连接 步骤 2 : 收发数字 步骤 3 : 收发字符串 步骤 4 : 使用Scanner 步骤 5 : 练习-服务端和客户端互聊 步骤 6 : 答案-服务端和客户端互聊 步骤 7 : 练习-聊天机器人数据库 步骤 8 : 答案-聊天机器人数据库
1. 服务端开启8888端口,并监听着,时刻等待着客户端的连接请求
2. 客户端知道服务端的ip地址和监听端口号,发出请求到服务端 客户端的端口地址是系统分配的,通常都会大于1024 一旦建立了连接,服务端会得到一个新的Socket对象,该对象负责与客户端进行通信。 注意: 在开发调试的过程中,如果修改过了服务器Server代码,要关闭启动的Server,否则新的Server不能启动,因为8888端口被占用了 package socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
//服务端打开端口8888
ServerSocket ss = new ServerSocket(8888);
//在8888端口上监听,看是否有连接请求过来
System.out.println("监听在端口号:8888");
Socket s = ss.accept();
System.out.println("有连接过来" + s);
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package socket;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
//连接到本机的8888端口
Socket s = new Socket("127.0.0.1",8888);
System.out.println(s);
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
一旦建立了连接,服务端和客户端就可以通过Socket进行通信了
1. 客户端打开输出流,并发送数字 110 2. 服务端打开输入流,接受数字 110,并打印 package socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("监听在端口号:8888");
Socket s = ss.accept();
//打开输入流
InputStream is = s.getInputStream();
//读取客户端发送的数据
int msg = is.read();
//打印出来
System.out.println(msg);
is.close();
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
// 打开输出流
OutputStream os = s.getOutputStream();
// 发送数字110到服务端
os.write(110);
os.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
直接使用字节流收发字符串比较麻烦,使用数据流对字节流进行封装,这样收发字符串就容易了
1. 把输出流封装在DataOutputStream中 使用writeUTF发送字符串 "Legendary!" 2. 把输入流封装在DataInputStream 使用readUTF读取字符串,并打印 package socket;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("监听在端口号:8888");
Socket s = ss.accept();
InputStream is = s.getInputStream();
//把输入流封装在DataInputStream
DataInputStream dis = new DataInputStream(is);
//使用readUTF读取字符串
String msg = dis.readUTF();
System.out.println(msg);
dis.close();
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package socket;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream os = s.getOutputStream();
//把输出流封装在DataOutputStream中
DataOutputStream dos = new DataOutputStream(os);
//使用writeUTF发送字符串
dos.writeUTF("Legendary!");
dos.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在上个步骤中,每次要发不同的数据都需要修改代码
可以使用Scanner读取控制台的输入,并发送到服务端,这样每次都可以发送不同的数据了。 package socket;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
//使用Scanner读取控制台的输入,并发送到服务端
Scanner sc = new Scanner(System.in);
String str = sc.next();
dos.writeUTF(str);
dos.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
前面部分的学习效果是服务端接受数据,客户端发送数据。
做相应的改动,使得服务端也能发送数据,客户端也能接受数据,并且可以一直持续下去
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
3分53秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 package socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("监听在端口号:8888");
Socket s = ss.accept();
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while (true) {
String msg = dis.readUTF();
System.out.println("收到客户端信息"+msg);
Scanner sc = new Scanner(System.in);
String str = sc.next();
dos.writeUTF(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true){
Scanner sc = new Scanner(System.in);
String str = sc.next();
dos.writeUTF(str);
String msg = dis.readUTF();
System.out.println("收到服务端信息"+msg);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
首先创建一个数据库android(android现在是手机操作系统,其本意是机器人的意思)
然后创建一个表dictionary,字段: id int receive varchar(100) response varchar(100) receive 表示受到的信息 response 表示回应的信息 在这个表里准备一些数据: 你好 -> 好你妹! 你叫什么 -> 你想泡我啊? 打你哦 -> 来啊,来打我啊,不打有点挫 等等 等等 开发一个程序,当从scanner读取到消息,发给Server服务端,服务端用这个消息到表dictionary中找到对应的相应,返回出去。 看上去就像在自动回应一样。 如果一个recieve有多条response,则随机返回一条
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
6分25秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器
create database android;
use android;
create table dictionary(
id int AUTO_INCREMENT,
receive varchar(100),
response varchar(100),
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
insert into dictionary values(null,'你好','好你妹!');
insert into dictionary values(null,'你叫什么','你想泡我啊?');
insert into dictionary values(null,'你叫什么','同志,不约');
insert into dictionary values(null,'打你哦','来啊,来打我啊,不打有点挫');
package socket;
public class Dictionary {
int id;
String receive ;
String response;
}
package socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import charactor.Hero;
public class DictionaryDAO {
public DictionaryDAO() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/android?characterEncoding=UTF-8", "root",
"admin");
}
public List<Dictionary> query(String recieve) {
List<Dictionary> ds = new ArrayList<Dictionary>();
String sql = "select * from dictionary where receive = ? ";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, recieve);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Dictionary d = new Dictionary();
int id = rs.getInt(1);
String receive = rs.getString("receive");
String response = rs.getString("response");
d.id=id;
d.receive=receive;
d.response=response;
ds.add(d);
}
} catch (SQLException e) {
e.printStackTrace();
}
return ds;
}
}
package socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Server {
private static List<String> cannotUnderstand= new ArrayList<>();
static{
cannotUnderstand.add("听求不懂啊");
cannotUnderstand.add("说人话");
cannotUnderstand.add("再说一遍?");
cannotUnderstand.add("大声点");
cannotUnderstand.add("老子在忙,一边玩儿去");
}
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("监听在端口号:8888");
Socket s = ss.accept();
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while (true) {
String msg = dis.readUTF();
System.out.println(msg);
List<Dictionary> ds= new DictionaryDAO().query(msg);
String response = null;
if(ds.isEmpty()){
Collections.shuffle(cannotUnderstand);
response = cannotUnderstand.get(0);
}
else{
Collections.shuffle(ds);
response = ds.get(0).response;
}
dos.writeUTF(response);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
dos.writeUTF(str);
String msg = dis.readUTF();
System.out.println(msg);
System.out.println();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2024-07-17
结合 网络 和 Mysql 实现简易聊天机器人
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2023-09-02
练习-聊天机器人数据库
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2022-05-08
连接被拒绝异常java.net.ConnectException: Connection refused: connect
2022-01-12
练习 - 聊天机器人数据库
2022-01-11
练习 - 客户端与服务端互聊
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 47 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|