局域网内的多功能聊天室源代码:
import java.net.*; import java.util.*; import java.io.*; public class ChatServer
{ static final int DEFAULT_PORT = 6000;
static ServerSocket serverSocket; static Vector
static Vector
public static void sendAll(String s)
{if (connections != null) {for (Enumeration e = connections.elements(); // Enumeration过时的接口,// 可以用
e.hasMoreElements();)
{try {PrintWriter pw = new PrintWriter(((Socket) e.nextElement()) .getOutputStream());
pw.println(s); pw.flush();
for each循环
} catch (IOException ex) {ex.printStackTrace(); }}}
System.out.println(s);
}
//发送信息给单独一个人
public static boolean sendOne(String name, String msg) {if (clients != null) {for (Enumeration e = clients.elements(); e.hasMoreElements();)
{ClientProc cp = (ClientProc) e.nextElement(); if ((cp.getName()).equals(name))
{try {PrintWriter pw = new PrintWriter((cp.getSocket())
.getOutputStream()); pw.println(msg);
pw.flush(); return true; // 返回值为真,找到了这个人可以进行聊天 } catch (IOException ioe) {ioe.printStackTrace();
}}}}
return false;// 没有找到这个人,应该是此人已经退出了聊天室
}
public static void addConnection(Socket s, ClientProc cp)
{if (connections == null)
{connections = new Vector
clients.addElement(cp);}
public static void deleteConnection(Socket s, ClientProc cp)
throws IOException {if (connections != null)
{connections.removeElement(s); s.close();} if (clients != null)
{clients.removeElement(cp);}} public static Vector getClients() {return clients;}
/*服务器端在此启动*/
public static void main(String[] arg) {int port = DEFAULT_PORT; try
{serverSocket = new ServerSocket(port); System.out.println(\服务器已经启动,正在监听...\} catch (IOException e)
{System.out.println(\异常\
System.err.println(e); System.exit(1);}
while (true) { // 死循环
try
{Socket cs = serverSocket.accept(); ClientProc cp = new ClientProc(cs); // 启动一个用户线程
Thread ct = new Thread(cp); //Thread ar = new Thread(ct.)
ct.start(); addConnection(cs, cp);
} catch (IOException e) {System.err.println(e);}}}}
import java.net.*; import java.util.*; import java.io.*;
class ClientProc implements Runnable {/*为某个用户服务的一个用户线程*/
Socket s;
BufferedReader in; PrintWriter out;
private String name = null;
private String sex = null;
public ClientProc(Socket s) throws IOException {this.s = s; in = new BufferedReader(new InputStreamReader(s.getInputStream()));// 得到输入的
端口流 out = new PrintWriter(s.getOutputStream());// 从端口得到一个输出流
this.updateList();} public String getName() {return name;} public String getSex() {return sex;}
public Socket getSocket() {return s;}
private void updateList()
{// 更新用户列表(即发送当前在聊天室的用户到新来的用户列表中)
Vector cs = ChatServer.getClients(); if (cs != null)
{for (Enumeration e = cs.elements(); e.hasMoreElements();)
{ClientProc cp = (ClientProc) e.nextElement();
String exist_name = cp.getName();
String exit_sex = cp.getSex();
System.out.println(\out.println(\out.flush();}}}
public void run()
{while (name == null)
{try {String inmsg; inmsg = in.readLine(); ChatServer.sendAll(\+ inmsg); // 发送信息更新用户列表 new & {try
{String line = in.readLine(); System.out.println(line);// 处理退出事件(读取信息)
if (line.equals(\
// & boy
String[] userInfo;
userInfo = inmsg.split(\name = userInfo[0]; sex = userInfo[1];
zhangsan
} catch (IOException ee) {ee.printStackTrace();}}
while (true)
{ChatServer.sendAll(\【系统消息】 \退出了聊天室\
ChatServer.deleteConnection(s, this); return;// 处理刷新用户列表请求
} else if (line.equals(\ {this.updateList();
// 一般消息,又可以分为几种,对大家说, 与某个人交谈,或者私聊
} else
{String[] inmsg = line.split(\ if (inmsg[0].compareTo(\
{ChatServer.sendOne(inmsg[1], \
+ this.name);
} else if (inmsg[0].compareTo(\发送文件消息 {// String[] sendfile = line.split(\ ChatServer.sendOne(inmsg[1], \
+ this.name + \ + \
} else if (inmsg[0].compareTo(\接收文件消息 {// String[] acceptfile = line.split(\ ChatServer
.sendOne(inmsg[1], inmsg[0] + \
} else if (inmsg[0].compareTo(\拒绝接收文件消息 {// String[] refusefile = line.split(\ ChatServer .sendOne(inmsg[1], inmsg[0] + \} else if (!line.startsWith(\{ // 对所有人说
ChatServer.sendAll(this.name + \
// String[] inmsg = line.split(\ else if (inmsg[1].equals(\ {if (ChatServer.sendOne(inmsg[2], \
+ name + \{ // success
out.println(\ + inmsg[2] + \// 再发给自己一份 out.flush(); // 一定要有
} else
{out.println(inmsg[2] + \已经离开聊天室\ out.flush(); // 一定要记住要}
} else
{ChatServer.sendAll(\ + inmsg[2] + \发给所有的人}
} catch (IOException e)
{System.out.println(e.toString());
try
{s.close();
} catch (IOException e2) {}
return;}}}}
import javax.swing.JFileChooser; import javax.swing.JProgressBar; import java.util.Date; import java.util.Calendar;
import javax.swing.JTextArea; //import RTFReceiveFrame; import java.awt.*; import java.awt.event.*; import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.text.BadLocationException; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument;
import java.net.*; import java.io.*;
import java.net.Socket;
public class ChatFrame extends JFrame implements ActionListener, ItemListener, Runnable, KeyListener
{sendfilethread sendthread;// 发送文件线程;
acceptfilethread acceptthread;// 接收文件线程 Socket acceptfilesocket; // 接收文件传输连接 Socket sendfilesocket; // 发送文件传输连接 ServerSocket fileserver; // 传输文件服务器 String filemsg = null; // 保存文件输入流
String sendfilename = null;// 保存欲发送的文件名 String IP;// 保存本机IP= InetAddress.getLocalHost();// Boolean acceptboolean = false; Boolean sendboolean = false;
int port = 6200;
JProgressBar acceptProgressbar;// 接收进度条 JProgressBar sendProgressbar; // 发送进度条 private Box leftbox = null; private Box rightbox = null;
private Box leftrightbox = null; private Box rightleftbox = null;
private JButton sendfile; // 发送文件按钮