用java多线程实现一个控制台聊天室
2010-11-03 15:20
741 查看
package tf.thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatServer {
private static final int PORT = 8888; // 端口号
private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
private ExecutorService exec;
private ServerSocket server;
public static void main(String[] args) {
new ChatServer();
}
public ChatServer() {
try {
server = new ServerSocket(PORT);
exec = Executors.newCachedThreadPool();
System.out.println("服务器已启动!");
Socket client = null;
while (true) {
client = server.accept(); // 接收客户连接
list.add(client);
exec.execute(new ChatTask(client));
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class ChatTask implements Runnable {
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private String msg;
public ChatTask(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
+ list.size() + "】人";
sendMessage();
}
public void run() {
try {
while ((msg = br.readLine()) != null) {
if (msg.trim().equals("bye")) {
list.remove(socket);
br.close();
pw.close();
msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
+ list.size() + "】人";
socket.close();
sendMessage();
break;
} else {
msg = "【" + socket.getInetAddress() + "】说:" + msg;
sendMessage();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 群发消息给聊天室的所有人
*/
private void sendMessage() throws IOException {
System.out.println(msg);
for (Socket client : list) {
pw = new PrintWriter(client.getOutputStream(), true);
pw.println(msg);
}
}
}
}
聊天室客户端(输入bye可退出聊天室)
Java代码
![](http://www.javaeye.com/images/icon_copy.gif)
package tf.thread;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatClient {
private static final int PORT = 8888;
private static ExecutorService exec = Executors.newCachedThreadPool();
public static void main(String[] args) throws Exception {
new ChatClient();
}
public ChatClient() {
try {
Socket socket = new Socket("192.168.1.120", PORT);
exec.execute(new Sender(socket));
System.out
.println("【" + socket.getInetAddress() + "】您好,欢迎来到阿飞聊天室!");
BufferedReader br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String msg;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
}
} catch (Exception e) {
}
}
/**
* 客户端线程获取控制台输入消息
*/
static class Sender implements Runnable {
private Socket socket;
public Sender(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
String msg;
while (true) {
msg = br.readLine();
pw.println(msg);
if (msg.trim().equals("bye")) {
pw.close();
br.close();
exec.shutdownNow();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatServer {
private static final int PORT = 8888; // 端口号
private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
private ExecutorService exec;
private ServerSocket server;
public static void main(String[] args) {
new ChatServer();
}
public ChatServer() {
try {
server = new ServerSocket(PORT);
exec = Executors.newCachedThreadPool();
System.out.println("服务器已启动!");
Socket client = null;
while (true) {
client = server.accept(); // 接收客户连接
list.add(client);
exec.execute(new ChatTask(client));
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class ChatTask implements Runnable {
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private String msg;
public ChatTask(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
+ list.size() + "】人";
sendMessage();
}
public void run() {
try {
while ((msg = br.readLine()) != null) {
if (msg.trim().equals("bye")) {
list.remove(socket);
br.close();
pw.close();
msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
+ list.size() + "】人";
socket.close();
sendMessage();
break;
} else {
msg = "【" + socket.getInetAddress() + "】说:" + msg;
sendMessage();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 群发消息给聊天室的所有人
*/
private void sendMessage() throws IOException {
System.out.println(msg);
for (Socket client : list) {
pw = new PrintWriter(client.getOutputStream(), true);
pw.println(msg);
}
}
}
}
package tf.thread; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ChatServer { private static final int PORT = 8888; // 端口号 private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象 private ExecutorService exec; private ServerSocket server; public static void main(String[] args) { new ChatServer(); } public ChatServer() { try { server = new ServerSocket(PORT); exec = Executors.newCachedThreadPool(); System.out.println("服务器已启动!"); Socket client = null; while (true) { client = server.accept(); // 接收客户连接 list.add(client); exec.execute(new ChatTask(client)); } } catch (IOException e) { e.printStackTrace(); } } static class ChatTask implements Runnable { private Socket socket; private BufferedReader br; private PrintWriter pw; private String msg; public ChatTask(Socket socket) throws IOException { this.socket = socket; br = new BufferedReader(new InputStreamReader(socket .getInputStream())); msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【" + list.size() + "】人"; sendMessage(); } public void run() { try { while ((msg = br.readLine()) != null) { if (msg.trim().equals("bye")) { list.remove(socket); br.close(); pw.close(); msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【" + list.size() + "】人"; socket.close(); sendMessage(); break; } else { msg = "【" + socket.getInetAddress() + "】说:" + msg; sendMessage(); } } } catch (IOException e) { e.printStackTrace(); } } /** * 群发消息给聊天室的所有人 */ private void sendMessage() throws IOException { System.out.println(msg); for (Socket client : list) { pw = new PrintWriter(client.getOutputStream(), true); pw.println(msg); } } } }
聊天室客户端(输入bye可退出聊天室)
Java代码
![](http://www.javaeye.com/images/icon_copy.gif)
package tf.thread;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatClient {
private static final int PORT = 8888;
private static ExecutorService exec = Executors.newCachedThreadPool();
public static void main(String[] args) throws Exception {
new ChatClient();
}
public ChatClient() {
try {
Socket socket = new Socket("192.168.1.120", PORT);
exec.execute(new Sender(socket));
System.out
.println("【" + socket.getInetAddress() + "】您好,欢迎来到阿飞聊天室!");
BufferedReader br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String msg;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
}
} catch (Exception e) {
}
}
/**
* 客户端线程获取控制台输入消息
*/
static class Sender implements Runnable {
private Socket socket;
public Sender(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
String msg;
while (true) {
msg = br.readLine();
pw.println(msg);
if (msg.trim().equals("bye")) {
pw.close();
br.close();
exec.shutdownNow();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
相关文章推荐
- 用java多线程实现一个控制台聊天室
- 用java多线程实现一个控制台聊天室
- 用Java的套接字编程实现一个多线程的回显(echo)服务器
- java 实现一个基于控制台的 扫雷 游戏
- Rhyme/ java TCP网络编程 聊天室(群聊与私聊)TCP、多线程、IO流编程完整代码实现
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- 编写一个控制台版本的局域网聊天室实现多人聊天
- java使用socket实现一个多线程web服务器
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- java实现一个简单TCPSocket聊天室功能分享
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- 【Java】基于TCP协议多线程服务器-客户端交互控制台聊天室简例
- Java 多线程Socket编程通讯--实现聊天室代码
- 用java实现简单的网络通信,相当于一个最简单的控制台qq(附代码) 推荐
- 网易2015编程题(一用Java实现一个多线程程序将这个10000个数输出到5个不用文件中)
- Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例
- Java IO——Socket:通过多线程实现多客户端与一个服务端通信
- [JAVA]多人聊天室控制台实现,服务端向所有客户端下发消息实现
- Java IO——Socket:通过多线程实现多客户端与一个服务端通信