一个java版本的控制台版的聊天室,记录一下。以便后续使用
服务端
package com.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 1.创建服务器端口
* 2.接收客户端连接
* 3.发送数据
* @author jacktan
*
*/
public class Server
{
public List<MyCall> all = new ArrayList<>();
public static void main(String[] args) throws IOException
{
new Server().start();
}
public void start() throws IOException {
//1.创建服务器端口,指定端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.接收客户端连接,阻塞
while ( true ) {
Socket socket = serverSocket.accept();
MyCall my = new MyCall(socket);
//将客户端添加到容器中
all.add(my);
new Thread(my).start();
}
}
private class MyCall implements Runnable {
private BufferedReader br = null;
private BufferedWriter bw = null;
private boolean isRunning = true;
private String name;
public MyCall(Socket socket)
{
try
{
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
this.name = br.readLine();
this.send(this.name+"欢迎您进入聊天室");
this.sendOther(this.name+"进入聊天室");
} catch (IOException e)
{
isRunning = false;
}
}
/**
* 读取消息
* @return
*/
public String receive() {
String lineText = "";
try
{
lineText = br.readLine();
} catch (IOException e)
{
isRunning = false;
CloseUtils.closeAll(br);
all.remove(this);
}
return lineText;
}
/**
* 发送数据
* @param msg
*/
public void send(String msg) {
if ( msg == null || "".equals(msg) ) {
return;
}
//私聊只需要改这里的代码就可以了
try
{
bw.write(msg);
bw.newLine();
bw.flush();
} catch (IOException e)
{
isRunning = false;
CloseUtils.closeAll(bw);
all.remove(this);
}
}
/**
* 发送给其他人
*/
public void sendOther(String msg) {
//发送消息给所有人,不包含自己
for ( MyCall m : all ) {
if ( m != this ) {
m.send(msg);
}
}
}
@Override
public void run()
{
while ( isRunning ) {
sendOther(receive());
}
}
}
}
客户端:
package com.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 1.创建连接
* 2.接收数据
* @author jacktan
*
*/
public class Client
{
public static void main(String[] args) throws UnknownHostException, IOException
{
System.out.println("请输入您的名称:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
Socket client = new Socket("localhost",8888);
new Thread(new Send(client,name)).start();
new Thread(new Receive(client)).start();
}
}
发送数据:
package com.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
/**
* 发送数据的线程
*
* @author jacktan
*
*/
public class Send implements Runnable
{
// 1.获取控制台输入流
private BufferedReader console;
// 2.获取输出流
private BufferedWriter bw;
// 3.当前线程标识
private boolean isRunning = true;
// 4.客户名称
private String name;
public Send()
{
console = new BufferedReader(new InputStreamReader(System.in));
}
public Send(Socket socket,String name)
{
this();
this.name = name;
try
{
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//客户端一进入就给服务器发送一条消息
send(this.name);
} catch (IOException e)
{
// 不让线程再运行
isRunning = false;
CloseUtils.closeAll(console,bw);
}
}
//从控制台接收数据
private String getMsgFromConsole() {
try
{
return console.readLine();
} catch (IOException e)
{
// TODO Auto-generated catch block
//e.printStackTrace();
}
return "";
}
//发送数据
public void send(String msg) {
if ( msg != null && !msg.equals("") ) {
try
{
bw.write(msg);
//换行并强制刷新
bw.newLine();
bw.flush();
} catch (IOException e)
{
//发送失败退出
isRunning = false;
CloseUtils.closeAll(console,bw);
}
}
}
@Override
public void run()
{
while (isRunning)
{
send(getMsgFromConsole());
}
}
}
接收数据:
package com.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import javax.sound.sampled.ReverbType;
/**
* 接收数据的线程
* @author jacktan
*
*/
public class Receive implements Runnable
{
//1.获取输入流
private BufferedReader br = null;
//2设置标识符
private boolean isRunning = true;
public Receive(Socket socket)
{
try
{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e)
{
isRunning = false;
CloseUtils.closeAll(br);
}
}
/**
* 接收数据
*/
public String receive() {
String lineText = "";
try
{
lineText = br.readLine();
} catch (IOException e)
{
isRunning = false;
CloseUtils.closeAll(br);
}
return lineText;
}
@Override
public void run()
{
while ( isRunning ) {
System.out.println(receive());
}
}
}
关闭资料功能类
package com.tcp;
import java.io.Closeable;
import java.io.IOException;
public class CloseUtils
{
/**
* 关闭所有流
*
* @param io
*/
public static void closeAll(Closeable... io)
{
for (Closeable temp : io)
{
if (temp != null)
{
try
{
temp.close();
} catch (IOException e)
{
// TODO Auto-generated catch block
}
}
}
}
}