package com.czp.chatv2;
//模拟匿名聊天软件服务器
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
class Server extends Frame implements WindowListener,ActionListener{
//界面的组件
private Label portLabel =new Label("请输入端口号 ");
private Label space =new Label(" ");
private TextField portText =new TextField(10);
private Button start =new Button("默认端口");
private Button custom =new Button("自定义端口");
private Button exit =new Button("退出");
private Label sayLabel =new Label("输入框: ");
private TextField sayText=new TextField(60);
private Button send=new Button("发送");
private TextArea info =new TextArea();
private Panel p1=new Panel();
private Panel p2=new Panel();
private Panel p3=new Panel();
//要用到的一些变量(先声明)
private ServerSocket server;
private Socket socket ;
private BufferedReader br;
private PrintWriter pw;
private int port;
private ServerThread st;
private int myDefaultPort = 7777;
private int userPort;
private HashSet<Socket> allSocket;// 保存所有服务器的套接字集合
Random rand = new Random();
private int customPort = rand.nextInt(8000)+ 7000;
public static void main(String[] args)
{
new Server();
}
public int getCustomPort()
{
return this.customPort;
}
public int getMyDefaultPort()
{
return this.myDefaultPort;
}
//构造方法
public Server()
{
setSize(700,700);
initView();
addListener();
setVisible(true);
allSocket = new HashSet<>();// 实例化服务器套接字集合
}
//初始化网络(默认端口)
void initNet(int port)
{
try
{
server = new ServerSocket(port);// 实例化服务器套接字,设定端口为输入的或默认(7777)
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true)// 启动服务器,循环获取服务器监听
{
Socket socket = null;
try
{
socket = server.accept();// 服务器监听是否有客户端接入
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("有客户端连接上服务器");
allSocket.add(socket);// 连接成功的客户端放入集合中
ServerThread t = new ServerThread(socket);
t.start();
}
}
class ServerThread extends Thread// 发送一个客户端信息给所有客户端
{
Socket socket;// 客户端套接字
public ServerThread(Socket socket)// 带参数(客户端套接字)的构造方法
{
this.socket = socket;// 参数赋值给客户端套接字
}
public void run()
{
br = null;
try
{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 获得套接字的字节流
while(true)
{
String str = br.readLine();// 读取字符串
if (str.contains("EXIT"))// 若字符串中有EXIT内容(有用户退出聊天室),提醒其他人
{
// 用户退出聊天室,给服务器发送"%EXIT%:用户名"(自定义规则)
String tmp = str.split(":")[1] + "用户退出聊天室";// 依据:分隔成两个元素,取第2个元素(用户名)
sendMessageToAllClient(tmp);// 告诉所有人,他退出了
allSocket.remove(socket);// 移除离开的客户端
socket.close();// 关闭客户端
return;// 停止线程
}
sendMessageToAllClient(str);// 如果没有EXIT内容。调用服务器转发方法,转发所有消息。
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void sendMessageToAllClient(String str)//服务器转发方法,参数str是发送的内容
{
for (Socket s : allSocket)// 遍历所有接入的客户端
{
try
{
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));// 客户端输出流
bw.write(str);// 输出str
info.append(str+"\n");
bw.newLine();// 换行
bw.flush();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}// 强制将输出流缓冲区的数据送出,清空缓冲区。
}
}
//初始化界面
void initView()
{
this.setTitle("服务器程序");
setLayout(new BorderLayout());
p2.setLayout(new BorderLayout());
p1.add(portLabel);
p1.add(portText);
p1.add(space);
p1.add(start);
p1.add(custom);
p1.add(exit);
p2.add(info);
p3.add(sayLabel);
p3.add(sayText);
p3.add(send);
this.add(p1,BorderLayout.NORTH);
this.add(p2,BorderLayout.CENTER);
this.add(p3,BorderLayout.SOUTH);
}
//添加监听的函数
void addListener(){
this.addWindowListener(this);
start.addActionListener(this);
custom.addActionListener(this);
send.addActionListener(this);
}
// 关闭套接字
void closeSocket()
{
try
{
if (st != null)
{
Thread.interrupted();// Thread.stop方法被弃用,用Thread.interrupted()方法来代替
// rt.stop();
st = null;
}
if (br != null)// 无效指令,已被放弃
{
// br.close();
br = null;
}
if (pw != null)
{
pw.close();
pw = null;
}
if (socket != null)
{
socket.close();
socket = null;
}
if (server != null)
{
server.close();
server = null;
}
} catch (Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
}
//设置退出按钮,实现所有接口
public void windowActivated(WindowEvent e)
{
}
public void windowClosed(WindowEvent e)
{
}
public void windowClosing(WindowEvent e)
{
if(pw!=null)
pw.println("Server exit");
closeSocket();
System.exit(0);
}
public void windowDeactivated(WindowEvent e)
{
}
public void windowDeiconified(WindowEvent e)
{
}
public void windowIconified(WindowEvent e)
{
}
public void windowOpened(WindowEvent e)
{
}
public void actionPerformed(ActionEvent e)
{
//如果事件是连接按钮
if(e.getSource()==start)//如果是默认端口
{
System.out.println("默认端口号是"+myDefaultPort);
this.initNet(myDefaultPort);
}
if(e.getSource()==exit)
{
if(pw!=null)
pw.println("Server exit");
closeSocket();
System.exit(0);
}
if(e.getSource()==custom)//如果是自定义端口
{
String strPort = portText.getText();
strPort.trim();
customPort = Integer.parseInt(strPort);
System.out.println("已自动转换至"+customPort+"端口");
this.initNet(customPort);
}
//点击发送按钮的时间
if(e.getSource()==send)
{
String sendMessage=sayText.getText();
info.append(" 管理员:"+"\n" +
" "+sendMessage+"\n");
pw.println(sendMessage);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于java的匿名聊天室-课程设计(含课程报告和代码).rar

共24个文件
class:13个
png:5个
java:2个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
基于java的匿名聊天室-课程设计(含课程报告和代码)
资源推荐
资源详情
资源评论
















收起资源包目录





































共 24 条
- 1
资源评论

- yeyeyin2022-05-18用户下载后在一定时间内未进行评价,系统默认好评。


创创大帝(水印很浅-下载的文档)
- 粉丝: 1903
- 资源: 5393
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
