Server:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/* 实现局域网的群聊系统
* 1.要求能够实现多人在同一个界面上群聊
* 2.写一个登录界面
* 3.按个enter可以发送消息
*
* */
public class Server
{
public static void main(String[] args) throws Exception
{
//用来存储连接的客户端
ArrayList<Socket> al=new ArrayList<Socket>();
ServerSocket server=new ServerSocket(3333);
//死循环,无限监听连接到此服务器端的客户端
while(true)
{
Socket socket=server.accept();
al.add(socket);//有连接的客户端,就将该客户端保存在集合类中
new ServerThread(socket,al).start();
}
}
}
ServerThread服务器端线程:import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
public class ServerThread extends Thread
{
Socket s;
ArrayList<Socket> al;
public ServerThread(Socket s, ArrayList<Socket> al)
{
this.s = s;
this.al = al;
}
public void run()
{
try
{
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true)
{
String message=br.readLine();//获取从客户端读取的信息
//遍历集合类,将消息转发到集合类中所有的客户端
for(Socket socket:al)
{
//获得集合类中单个客户端的输出流
PrintWriter pw=new PrintWriter(socket.getOutputStream());
pw.println(message);//将消息打印到输出流中
pw.flush();
}
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}Client客户端开始界面:
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket=new Socket(InetAddress.getByName("192.168.1.240"),3333);
String name=JOptionPane.showInputDialog("请输入用户名:");
new MyFrame(socket,name);
}
}ClientThread 客户端线程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ClientThread extends Thread
{
Socket socket;
MyFrame mf;
public ClientThread(Socket socket, MyFrame mf)
{
this.socket = socket;
this.mf = mf;
}
public void run()
{
try
{
//获得客户端的输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
//获得从服务器输入的信息
String message=br.readLine();
//将信息输入到文本域中
mf.area.setText(mf.area.getText()+"\n"+message);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}MyFrame前台界面框架:
import java.awt.BorderLayout;
import java.awt.Container;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MyFrame
{
Socket socket;
JTextField field;
JTextArea area;
JFrame frame;
public MyFrame(Socket socket,String name)
{
this.socket=socket;
frame=new JFrame(name);
Container con=frame.getContentPane();
con.setLayout(new BorderLayout());
JPanel p=new JPanel();
area=new JTextArea(20,20);
p.add(area);
con.add(p,BorderLayout.CENTER);
JPanel pan=new JPanel();
field=new JTextField(15);
JButton btn=new JButton("发送");
pan.add(field);
pan.add(btn);
MyListener ml=new MyListener(socket, this);
new ClientThread(socket, this).start();
btn.addActionListener(ml);
con.add(pan, BorderLayout.SOUTH);
frame.setSize(250, 250);
frame.setVisible(true);
}
}MyListener 监听:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MyListener implements ActionListener
{
Socket s;
MyFrame mf;
public MyListener(Socket s, MyFrame mf)
{
this.s = s;
this.mf = mf;
}
@Override
public void actionPerformed(ActionEvent e)
{
String str=e.getActionCommand();
System.out.println(str);
if(str.equals("发送"))
{
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}————————————————————————————————
额外:
1 如果自己写窗口实现登陆,然后跳转第二个窗口。前一个窗口貌似只能隐藏,不能关闭,可以用jframe.dispose()来隐藏窗口释放资源;System.exit(0),全部退出
2 按回车键实现发送,添加监听:
if(e.getKeyCode() == KeyEvent.VK_ENTER) //判断按下的键是否是回车键
{
String str=mf.field.getText();
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
e1.printStackTrace();
}
}
本文介绍了一个简单的局域网群聊系统实现方案,包括服务器端、客户端的代码设计及界面展示。系统允许多用户在同一界面进行聊天,并通过监听键盘事件实现消息发送。
230

被折叠的 条评论
为什么被折叠?



