一个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 } } } } }
相关推荐
Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,它利用了Socket接口来构建一个局域网内的多人聊天环境,类似于QQ群的功能。在这个项目中,开发者运用了多线程技术来处理并发的用户交互,同时利用...
Java Socket聊天室是一种基于Java网络编程技术实现的通信系统,主要使用了Socket接口来构建客户端与服务器端的连接。在这个项目中,用户通过控制台(console)进行交互,体验类似于简单的在线聊天室。以下是对这个Java...
Java Socket聊天室是一种基于TCP/IP协议的网络通信应用,它允许客户端和服务端通过Socket进行双向通信,实现数据的交换。本项目提供了一个完整的聊天室实现,包括服务端和客户端的代码,具有图形用户界面(GUI),...
在这个"Java socket聊天室+窗口抖动"项目中,我们将探讨如何使用Java Socket构建一个基本的多人在线聊天室,并且实现窗口抖动功能,以增加用户体验。 首先,我们要理解Socket的工作原理。Socket是两台计算机之间...
Java Socket聊天室是一种基于Java的网络通信应用,利用Socket API实现客户端与服务器端的实时交互。Socket编程是网络编程的基础,它提供了两台计算机之间的低级别连接,使得数据可以在网络上进行双向传输。在这个...
标题中的“flash as3/java socket 聊天室”指的是使用Adobe Flash ActionScript 3(AS3)语言和Java的Socket编程技术实现的一个在线聊天应用程序。这个应用允许用户通过网络进行实时通信,创建一个基本的聊天环境。...
Java Socket聊天室源程序是一个基于Java编程语言实现的网络通信应用,主要利用Socket API来创建一个简单的多人在线聊天环境。Socket是TCP/IP协议的一部分,它允许两个或多个网络应用程序之间进行双向通信。在这个...
Java Socket聊天室与Java URL爬虫是两种不同的技术应用场景,它们在Java编程中都有重要的地位。Socket主要用于实现网络通信,而URL爬虫则用于数据抓取。下面将详细阐述这两个主题。 首先,Java Socket编程是Java...
Java Socket 聊天室 多线程实现 Server End: How? Message From Client:[Hey~buddy~Where am I?] You're In My Office Message From Client:[Really?This Is Your Office?It's So Wonderful!] For Sure Buddy! ...
java socket 聊天室源码java socket 聊天室源码java socket 聊天室源码java socket 聊天室源码java socket 聊天室源码java socket 聊天室源码
打包后的Java Socket聊天室程序,安装了jre可直接双击运行。源码可去我的博客文章看http://blog.csdn.net/doudou15223155621/archive/2010/03/21/5402190.aspx
通过分析和学习这个Java Socket聊天室源码,开发者可以掌握网络通信的基本原理,了解如何实现简单的多用户交互,并为进一步开发更复杂的网络应用打下坚实基础。同时,这也是一种实践并发编程和控制台交互设计的好...
【标题】"聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_" 涉及的是基于Java的Socket编程技术,用于实现一个TCP/IP通信的即时聊天室。在这个项目中,开发者将学习如何利用Java的Socket类来创建客户端和...
用java写的,使用socket的聊天室,实现了群组聊天功能,但还存在一些小问题。