基于项目研究一继续分析
对上一篇博客实验的分析
上一篇博客我们最后的实验,进行的是单次聊天,也就是客户端向服务器端单向发送数据,这是不实际的。
单次聊天的缺点
只可以客户端先发送数据,然后才可以接收数据,如果不发就收不到(接收和发送是在一个线程内实现的)这是不符合实际情况的
怎么解决
- 多次聊天可以使用循环来解决
- 先发后收的问题可以使用线程来解决:一个线程接收数据,一个线程发送数据
将其完善为群聊的效果
先测试:单个客户端可以和服务器端进行多次通信
示例代码:
客户端和服务器端需要在两个不同的项目内,以模拟两个电脑进行通信
创建一个线程,用于发送数据:
package net.entity;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 这是发送的线程
*/
public class Send implements Runnable{
//2. 从键盘获取对象
private BufferedReader br;
private DataOutputStream dos;
private boolean flag = true; //默认为true
public Send(){
br = new BufferedReader(new InputStreamReader(System.in));
}
//发送数据的数据流
public Send(Socket client){
this();//调用本类的无参构造方法
try {
dos = new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dos,client);
}
}
private String getMessage(){
String str = null;
try {
str = br.readLine();
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(br);
}
return str;
}
private void send(String str){
try {
dos.writeUTF(str);
dos.flush(); //清空缓存
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dos);
}
}
@Override
public void run() {
while (flag){
//调用发送信息的方法
this.send(getMessage());
}
}
}
再次创建一个线程,用于接收数据:
package net.entity;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
/**
* 这是接收的线程
*/
public class Receive implements Runnable{
//用于接收数据的数据流
private DataInputStream dis;
private boolean flag = true; //默认为true
public Receive(Socket client){
try {
dis = new DataInputStream(client.getInputStream());
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dis,client);
}
}
//接收来自服务器的数据
private String getMessage(){
String str = "";
try {
str = dis.readUTF();
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dis);
}
return str;
}
@Override
public void run(