|
| » 首页 » 电脑_数码 » 编程 » 编写一类似QQ群聊的多人聊天程序 |
编写一类似QQ群聊的多人聊天程序 |
|
1. 要求服务器端程序支持多人同时连接. 2. 上线的任何一个人发送消息(只要求文本型消息),所有的人都能收到并显示。 |
![]() |
|
|
import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ChatClient extends JFrame implements ActionListener{ private Panel top, bottom; private TextField tfHost; private Button buttonConnect; private TextArea textArea; private TextField tfSend; private Button buttonSend; private String host; private Socket connect; ChatThread chatThread; private boolean connected = false; private DataOutputStream out; public ChatClient(){ //布局窗体顶部 tfHost = new TextField("localhost",30); buttonConnect = new Button("连接到服务器"); buttonConnect.addActionListener(this); top = new Panel(); top.setLayout(new FlowLayout()); top.add(tfHost); top.add(buttonConnect); //布局窗体底部 tfSend = new TextField(); tfSend.addActionListener(this); buttonSend = new Button("发出"); buttonSend.setEnabled(false); buttonSend.addActionListener(this); bottom = new Panel(); bottom.setLayout(new BorderLayout()); bottom.add(buttonSend,BorderLayout.EAST); bottom.add(tfSend,BorderLayout.CENTER); //文本输入框将填充窗体底剩余区域 textArea = new TextArea(); //布局窗体 getContentPane().setLayout(new BorderLayout()); getContentPane().add(top,BorderLayout.NORTH); getContentPane().add(bottom,BorderLayout.SOUTH); getContentPane().add(textArea,BorderLayout.CENTER); setSize(350,250); show(); } public void connectToServer(){ host = tfHost.getText(); try{ connect=new Socket(host,2525); out = new DataOutputStream(connect.getOutputStream()); chatThread = new ChatThread(connect,textArea); connected = true; buttonConnect.setLabel("断开连接"); buttonSend.setEnabled(true); }catch(UnknownHostException uhe){ textArea.append("无法连接到服务器,请检查服务器名称是否正确。\n"); // uhe.printStackTrace(); }catch(IOException ioe){ textArea.append("无法连接到服务器,请稍后再重试。\n"); // ioe.printStackTrace(); } } public void disConnect(){ try{ out.close(); }catch(IOException ioe){ ioe.printStackTrace(); } chatThread.chatting = false; buttonConnect.setLabel("连接到服务器"); connected = false; buttonSend.setEnabled(false); } public void actionPerformed(ActionEvent ev){ if(ev.getSource()==buttonConnect){ if(!connected){ connectToServer(); }else{ disConnect(); } } if(ev.getSource()==buttonSend||ev.getSource()==tfSend){ try{ textArea.append(">"+tfSend.getText()+"\n"); out.writeUTF("<"+tfSend.getText()+"\n"); tfSend.setText(""); }catch(IOException ioe){ textArea.append("服务器已断开连接!请重新连接。\n"); disConnect(); //ioe.printStackTrace(); } } } public static void main(String[] args){ ChatClient chat = new ChatClient(); chat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }; 服务端 import java.net.*; import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ChatServer extends JFrame implements ActionListener{ private Panel top, bottom; private Button buttonServer; private TextArea textArea; private TextField tfSend; private Button buttonSend; private String host; private Socket connect; private ServerSocket server; private ChatThread chatThread; private boolean listening = false; private DataOutputStream out; public ChatServer(){ //布局窗体顶部 buttonServer = new Button("开始服务"); buttonServer.addActionListener(this); top = new Panel(); top.setLayout(new FlowLayout()); top.add(buttonServer); //布局窗体底部 tfSend = new TextField(); tfSend.addActionListener(this); buttonSend = new Button("发出"); buttonSend.setEnabled(false); buttonSend.addActionListener(this); bottom = new Panel(); bottom.setLayout(new BorderLayout()); bottom.add(buttonSend,BorderLayout.EAST); bottom.add(tfSend,BorderLayout.CENTER); //文本输入框将填充窗体底剩余区域 textArea = new TextArea(); //布局窗体 getContentPane().setLayout(new BorderLayout()); getContentPane().add(top,BorderLayout.NORTH); getContentPane().add(bottom,BorderLayout.SOUTH); getContentPane().add(textArea,BorderLayout.CENTER); setSize(350,250); show(); } public void startService(){ try{ connect = server.accept();//开始在指定的端口监听,等待客服端连接 out = new DataOutputStream(connect.getOutputStream()); chatThread = new ChatThread(connect,textArea); listening = true; buttonServer.setLabel("停止服务"); buttonSend.setEnabled(true); }catch(IOException ioe){ ioe.printStackTrace(); } } public void stopService(){ try{ out.close(); server.close(); }catch(IOException ioe){ ioe.printStackTrace(); } chatThread.chatting = false; buttonServer.setLabel("开始服务"); listening = false; buttonSend.setEnabled(false); } public void actionPerformed(ActionEvent ev){ if(ev.getSource()==buttonServer){ if(!listening){ try{ server=new ServerSocket(2525); startService(); }catch(IOException ioe){ ioe.printStackTrace(); } }else{ stopService(); } } if(ev.getSource()==buttonSend||ev.getSource()==tfSend){ try{ textArea.append(">"+tfSend.getText()+"\n"); out.writeUTF("<"+tfSend.getText()+"\n");//用writeUTF方法是为了防止中文乱码 tfSend.setText(""); }catch(IOException ioe){ textArea.append("客户端已断开连接!正在等待客户重新连接。\n"); buttonSend.setEnabled(false); //startService(); ioe.printStackTrace(); } } } public static void main(String[] args){ ChatServer chat = new ChatServer(); chat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }; import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ChatClient extends JFrame implements ActionListener{ private Panel top, bottom; private TextField tfHost; private Button buttonConnect; private TextArea textArea; private TextField tfSend; private Button buttonSend; private String host; private Socket connect; ChatThread chatThread; private boolean connected = false; private DataOutputStream out; public ChatClient(){ //布局窗体顶部 tfHost = new TextField("localhost",30); buttonConnect = new Button("连接到服务器"); buttonConnect.addActionListener(this); top = new Panel(); top.setLayout(new FlowLayout()); top.add(tfHost); top.add(buttonConnect); //布局窗体底部 tfSend = new TextField(); tfSend.addActionListener(this); buttonSend = new Button("发出"); buttonSend.setEnabled(false); buttonSend.addActionListener(this); bottom = new Panel(); bottom.setLayout(new BorderLayout()); bottom.add(buttonSend,BorderLayout.EAST); bottom.add(tfSend,BorderLayout.CENTER); //文本输入框将填充窗体底剩余区域 textArea = new TextArea(); //布局窗体 getContentPane().setLayout(new BorderLayout()); getContentPane().add(top,BorderLayout.NORTH); getContentPane().add(bottom,BorderLayout.SOUTH); getContentPane().add(textArea,BorderLayout.CENTER); setSize(350,250); show(); } public void connectToServer(){ host = tfHost.getText(); try{ connect=new Socket(host,2525); out = new DataOutputStream(connect.getOutputStream()); chatThread = new ChatThread(connect,textArea); connected = true; buttonConnect.setLabel("断开连接"); buttonSend.setEnabled(true); }catch(UnknownHostException uhe){ textArea.append("无法连接到服务器,请检查服务器名称是否正确。\n"); // uhe.printStackTrace(); }catch(IOException ioe){ textArea.append("无法连接到服务器,请稍后再重试。\n"); // ioe.printStackTrace(); } } public void disConnect(){ try{ out.close(); }catch(IOException ioe){ ioe.printStackTrace(); } chatThread.chatting = false; buttonConnect.setLabel("连接到服务器"); connected = false; buttonSend.setEnabled(false); } public void actionPerformed(ActionEvent ev){ if(ev.getSource()==buttonConnect){ if(!connected){ connectToServer(); }else{ disConnect(); } } if(ev.getSource()==buttonSend||ev.getSource()==tfSend){ try{ textArea.append(">"+tfSend.getText()+"\n"); out.writeUTF("<"+tfSend.getText()+"\n"); tfSend.setText(""); }catch(IOException ioe){ textArea.append("服务器已断开连接!请重新连接。\n"); disConnect(); //ioe.printStackTrace(); } } } public static void main(String[] args){ ChatClient chat = new ChatClient(); chat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }; 服务端 import java.net.*; import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ChatServer extends JFrame implements ActionListener{ private Panel top, bottom; private Button buttonServer; private TextArea textArea; private TextField tfSend; private Button buttonSend; private String host; private Socket connect; private ServerSocket server; private ChatThread chatThread; private boolean listening = false; private DataOutputStream out; public ChatServer(){ //布局窗体顶部 buttonServer = new Button("开始服务"); buttonServer.addActionListener(this); top = new Panel(); top.setLayout(new FlowLayout()); top.add(buttonServer); //布局窗体底部 tfSend = new TextField(); tfSend.addActionListener(this); buttonSend = new Button("发出"); buttonSend.setEnabled(false); buttonSend.addActionListener(this); bottom = new Panel(); bottom.setLayout(new BorderLayout()); bottom.add(buttonSend,BorderLayout.EAST); bottom.add(tfSend,BorderLayout.CENTER); //文本输入框将填充窗体底剩余区域 textArea = new TextArea(); //布局窗体 getContentPane().setLayout(new BorderLayout()); getContentPane().add(top,BorderLayout.NORTH); getContentPane().add(bottom,BorderLayout.SOUTH); getContentPane().add(textArea,BorderLayout.CENTER); setSize(350,250); show(); } public void startService(){ try{ connect = server.accept();//开始在指定的端口监听,等待客服端连接 out = new DataOutputStream(connect.getOutputStream()); chatThread = new ChatThread(connect,textArea); listening = true; buttonServer.setLabel("停止服务"); buttonSend.setEnabled(true); }catch(IOException ioe){ ioe.printStackTrace(); } } public void stopService(){ try{ out.close(); server.close(); }catch(IOException ioe){ ioe.printStackTrace(); } chatThread.chatting = false; buttonServer.setLabel("开始服务"); listening = false; buttonSend.setEnabled(false); } public void actionPerformed(ActionEvent ev){ if(ev.getSource()==buttonServer){ if(!listening){ try{ server=new ServerSocket(2525); startService(); }catch(IOException ioe){ ioe.printStackTrace(); } }else{ stopService(); } } if(ev.getSource()==buttonSend||ev.getSource()==tfSend){ try{ textArea.append(">"+tfSend.getText()+"\n"); out.writeUTF("<"+tfSend.getText()+"\n");//用writeUTF方法是为了防止中文乱码 tfSend.setText(""); }catch(IOException ioe){ textArea.append("客户端已断开连接!正在等待客户重新连接。\n"); buttonSend.setEnabled(false); //startService(); ioe.printStackTrace(); } } } public static void main(String[] args){ ChatServer chat = new ChatServer(); chat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }; 一、这类程序一般要求CS(服务器-客户端)结构。 客户端用java写还有可能,服务器端用java似乎就不太靠谱。 多数情况下服务器端使用C++或delphi去做。 这是因为java的效率相对较低,难以应付对系统占用比较高的任务(当然,此为个人看法)。 二、想让别人为你写一个整体功能的东西是不大现实的,没人会吃饱了没事干花几天甚至几个月的时间为你的不靠谱的分去忙累。 如果你是想学东西,你应该自个去学着做,在做的过程中碰见什么问题再去解决什么问题,把问题细化。否则就算别人给你一个完整的代码,你也无从看起(还不说你能不能看懂)。 三、如果你说的是在网页上某人打一段话,大家都能看见,象某些网页上的聊天,那一般不是用的Java,那是依靠的WEB服务器做Server,使用动态网页(一般是ASP、PHP等)功能向服务器数据库提交或取数据,Java只是起辅助功能(如自动定时刷新等)。 爱莫能助 200分? java? 这样的工程,2W人民币未必会有人帮你做。。。 |
| 《编写一类似QQ群聊的多人聊天程序》答案收集时间:2008-06-14 14:27:55 |