聊天室代码(只能群聊,2个2个聊没想好.....)

本文介绍了一个简单的聊天室程序的设计与实现,包括客户端和服务端的代码示例。客户端负责用户输入和接收服务端消息,服务端则负责管理和广播消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聊天室小结:

查看ip地址:linux,/sbin/config
        Windows/ipconfig 


******************************************************************************************************

package day03;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
//聊天室的客户端
public class Client {
//套接字, java.net.Socket封装了TCP协议,使用它就可以基于TCP协议进行网络通讯, Socket是运行在客户端的
private Socket socket;
 //构造方法,用于初始化客户端,实例化Socket的过程就是连接的过程,若远程计算机没有响应会抛出异常

 //实例化Socket的时候传入两个参数:1.服务端的地址:通过IP地址可以找到服务的那台计算机

        2.服务端端口:通过端口可以找到服务端计算机上的服务端的应用程序

public Client() throws Exception{
System.out.println("正在连接服务端!");
socket=new Socket("localhost",8086);//ip,端口号(0~65535).
System.out.println("已经与服务端建立连接");
}
/启动客户端的方法
public void start(){
try {
Scanner scanner=new Scanner(System.in);
//现要求用户输入昵称
String nickName=null;
while(true){
System.out.println("请输入用户名");
nickName=scanner.nextLine();
if(nickName.length()>0){
break;
}
System.out.println("输入有误!");
}
System.out.println("欢迎你"+nickName+"!开始聊天吧!");

/*
* Socket提供的方法:
* OutputStream getOutputStream
* 获取一个字符输出流,通过该流
* 写出的数据会被发送至远端计算机
*/
OutputStream out=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out,"utf-8");
PrintWriter pw=new PrintWriter(osw,true);

//现在先将昵称发送给服务端
pw.println(nickName);
//启动读取服务器发送过来的消息的线程
ServerHandler handler=new ServerHandler();
Thread t=new Thread(handler);
t.start();
while(true){
//将字符串发送至服务端
pw.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args){
try {
Client client=new Client();
client.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("客户端启动失败!");
}
}
//该线程用于读取服务端发送过来的消息并输出到客户端控制台显示
class ServerHandler implements Runnable{
public void run() {
try {
InputStream in=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in,"utf-8");
BufferedReader br=new BufferedReader(isr);
String message=null;
while((message=br.readLine())!=null){
System.out.println(message);
}
} catch (Exception e) {

}
}
}

}

*********************************************************************************************************************************************************

package day03;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

//服务端
public class Server {
//运行在服务端的ServerSocket主要负责:
// 1.向系统申请服务端口,客户端就是通过这个端口与之相连
// 2.监听申请的服务端口,当一个客户端通过该端口尝试建立连接时,SreverSocket会在服务端创建一个Socket与客户端建立连接
private ServerSocket server;
 //保存所有客户端输出流的集合
private List<PrintWriter> allOut;
//用来初始化服务端
public Server()throws Exception{
//初始化的同时申请服务端口 
server=new ServerSocket(8086);
allOut=new ArrayList<PrintWriter>();
}
//将给定的输出流存入共享集合
private synchronized void addOut(PrintWriter out){
allOut.add(out);
}
//将给定的输出流从共享集合中删除
private synchronized void removeOut(PrintWriter out){
allOut.remove(out);
}
//将给定的消息发送给所有的客户端
private synchronized void sendMessage(String message){
for(PrintWriter out :allOut){
out.println(message);
}
}
//服务端开始工作的方法
public void start(){
try {
/*
* ServerSocket的accept方法
* 是一个阻塞方法,作用是监听
* 服务端口,直到一个客户端连接并创建
* 一个Socket,使用该Socket
* 即可与刚连接的客户端进行交互
*/
while(true){
System.out.println("等待客户端连接...");
Socket socket=server.accept();
System.out.println("一个客户端连接了!");
/*
* 启动一个线程,来完成与该客户端的交互
*/
ClientHandler handler=new ClientHandler(socket);
Thread t=new Thread(handler);
t.start();
}

} catch (Exception e) {

}

}
public static void main(String[] args) {
try {
Server server=new Server();
server.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务端启动失败!");
}
}

//该线程负责处理一个客户端的交互
class ClientHandler implements Runnable{
//该线程处理的客户端Socket
private Socket socket;
//客户端的地址信息
private String host;
//该用户的昵称
private String nickName;
public ClientHandler(Socket socket){
this.socket=socket;
//通过Socket可以获取远端计算机的地址信息
InetAddress address=socket.getInetAddress();
//获取ip地址
host=address.getHostAddress();
}
public void run(){
PrintWriter pw=null;
try {
/*
* Socket提供的方法
* InputStream getInputStream()
* 该方法可以获取一个输入流,从该流读取的数据
* 就是从远端计算机发送过来的
*/
InputStream in=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in,"utf-8");
BufferedReader br=new BufferedReader(isr);

//首先读取一行字符串为昵称
nickName=br.readLine();
sendMessage(nickName+"上线了!");
// 通过Socket创建输出流用于将消息发送给客户端
OutputStream out=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out,"utf-8");
pw=new PrintWriter(osw,true);
 //将该客户端的输出流存入到共享集合
addOut(pw);
String message=null;
/*
* br.readLine()在读取客户端发送过来的消息时,
* 由于客户端断线,而其操作系统的不同,这里读取后的结果
* 不同:
* 当windows的客户端断开时:
* br.readLine会抛异常
* 当linux的客户端断开时
* br.readLine()会返回null
*/
while((message=br.readLine())!=null){
//System.out.println(host+"说:"+message);
//pw.println(host+"说:"+message);
sendMessage(nickName+"说:"+message);
}
} catch (Exception e) {

}finally{
//处理当前客户端断开后的逻辑
//将该客户端的输出流从共享集合中删除
removeOut(pw);
sendMessage(nickName+"下线了!");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}




Java聊天室程序 需求分析 2.1 业务需求 1.聊天室成员一起天。 2. 可以与聊天室成员私。 3. 可以改变天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控天内容。 6. 服务器过滤非法内容。 7. 服务器发送通知。 8. 服务器踢人。 9. 保存服务器日志。 10.保存用户天信息。 2.2 系统功能模块 2.2.1 服务器端 1.处理用户注册 2.处理用户登录 3.处理用户发送信息 4.处理用户得到信息 5.处理用户退出 2.2.2 客户端 1.用户注册界面及结果 2.用户登录界面及结果 3.用户发送信息界面及结果 4.用户得到信息界面及结果 5.用户退出界面及结果 2.3 性能需求 运行环境:Windows 9x、2000、xp、2003,Linux 必要环境:JDK 1.5 以上 硬件环境:CPU 400MHz以上,内存64MB以上 3.1.2 客户端结构 ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。 Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。 Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。 ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送天内容与服务器端的Connection.java 亲密合作。 Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。 Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户天时,将当前用户名、天对象、天内容、天语气和是否私进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将天信息对象发送给服务器端 当用户发送天信息时,服务端将会收到客户端用Socket传输过来的天信息对象,然后将其强制转换为Chat对象,并将本次用户的天信息对象添加到天对象集Message中,以供所有天用户访问。 接收用户的天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。 当每次用户接收到天信息后将会开始分析天信息然后将适合自己的信息人性化地显示在天信息界面上。 4.1.1 问题陈述 1.接受用户注册信息并保存在一个基于文件的对象型数据库。 2.能够允许注册过的用户登陆天界面并可以天。 3.能够接受私信息并发送给特定的用户。 4.服务器运行在自定义的端口上#1001。 5.服务器监控用户列表和用户天信息(私除外)。 6.服务器踢人,发送通知。 7.服务器保存日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值