C/S聊天室
1.掌握使用JAVA语言进行面向对象设计的基本方法,提升运用分析问题,解决问题的能力。
2.使用Java技术完成聊天室系统,深刻学习使用Java语言。
3.使用Java 的多线程机制,深刻理解Java多线程技术的应用。
4.使用AWT和Swing事件,对Java的深刻学习。
5.使用网络编程,掌握基于TCP协议的Socket编程,了解Socket编程的协议约定,掌握简单应用协议的开发。
6.使用C/S架构,对网络编程有必定的了解
7.熟悉事件监听的应用和方法的编写
代码以下:
**java
①:Client客户端编程
import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; import org.omg.CORBA_2_3.portable.OutputStream; public class Demo1 extends JFrame implements ActionListener, MouseListener{ JTextArea area; JComboBox box; JTextField field1,field2,field3; JLabel label,label1; JButton button1,button2; JPanel panel1,panel2; JPopupMenu pop; JMenuItem popm1,popm2,popm3; Socket soc; InputStream in; public Demo1(){ super("聊天室"); this.setBounds(100, 100, 500, 400); area=new JTextArea(8,8); area.addMouseListener(this); area.setLineWrap(true);//自动换行 area.setEditable(false);//设置文本区域不可编辑 JScrollPane js=new JScrollPane(area);//添加滚动条 js.setBounds(0,0,480,250); js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//设置老是出现滚动条 panel1=new JPanel(); panel2=new JPanel(); String str[]={"全部人","0","1","2"}; box=new JComboBox(str); field1=new JTextField(20); field1.setEditable(false); field1.addActionListener(this); button1=new JButton("发送"); button1.setEnabled(false); button1.addActionListener(this); label1=new JLabel("用户名:"); field3=new JTextField(9); label=new JLabel("服务器名"); field2=new JTextField(8); field2.setText("localhost"); field2.addActionListener(this); button2=new JButton("链接"); button2.addActionListener(this); panel1.add(box); panel1.add(field1); panel1.add(button1); panel1.setBounds(50,260,400,50); panel2.add(label1); panel2.add(field3); panel2.add(label); panel2.add(field2); panel2.add(button2); panel2.setBounds(50,310,400,50); pop=new JPopupMenu(); popm1=new JMenuItem("复制"); popm1.addActionListener(this); popm2=new JMenuItem("剪切"); popm2.addActionListener(this); popm3=new JMenuItem("粘贴"); popm3.addActionListener(this); pop.add(popm1); pop.add(popm2); pop.add(popm3); area.add(pop); area.addMouseListener(this); field1.add(pop); field1.addMouseListener(this); setLayout(null); add(js); add(panel1); add(panel2); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { // TODO Auto-generated method stub new Demo1(); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getActionCommand().equals("复制")){ area.copy(); } if(e.getActionCommand().equals("剪切")){ field1.cut(); } if(e.getActionCommand().equals("粘贴")){ field1.paste(); } if(e.getSource()==button1||e.getSource()==field1){ area.append(field3.getText()+"对"+box.getSelectedItem()+"说: "+field1.getText()+"\n"); //area.append(field1.getText()+"\n"); try { java.io.OutputStream out = soc.getOutputStream(); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out)); //bw.write("对"+this.getTitle()+"说:"+field1.getText()); bw.write(field3.getText()+"-"+box.getSelectedItem()+"-"+field1.getText()); bw.newLine();//换行 bw.flush();//刷新 } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } field1.setText(""); }else{ if(e.getActionCommand().equals("链接")&&field2.getText().equals("")){ JOptionPane.showMessageDialog(null,"请输入正确的服务器名","信息",JOptionPane.INFORMATION_MESSAGE); }else if(e.getSource()==field2||e.getActionCommand().equals("链接")){ String fuwuqi=field2.getText(); if(!fuwuqi.equals("")){ System.out.println("服务器地址:"+fuwuqi); try { soc=new Socket(fuwuqi,7890); new ClientThread(soc.getInputStream(),area,field3.getText()).start();//当链接成功时,则启动线程 field2.setEditable(false);//当链接成功时,便不可再链接 button2.setEnabled(false);//设定链接按钮不可链接 field1.setEditable(true);//设定field1文本框可用 button1.setEnabled(true);//链接成功,则设发送按钮可用 String name=field3.getText();//获取用户名文本框中的值 this.setTitle(name+"聊天室");//设置标题 area.append(name+"登陆成功!"+"\n"); java.io.OutputStream out = soc.getOutputStream(); PrintWriter pw=new PrintWriter(out,true); pw.println("login"+"-"+field3.getText()+"-"+"上线啦!"); field3.setEditable(false);//输入用户名文本框设为不可用 //field3.setText("");//将用户名文本框的内容置为空 } catch (UnknownHostException e1) { // TODO Auto-generated catch block //e1.printStackTrace(); System.out.println("请输入正确的服务器名!"); } catch (IOException e1) { // TODO Auto-generated catch block //e1.printStackTrace(); System.out.println("服务器链接异常!"); } } field2.setText(""); } } } @Override public void mouseClicked(MouseEvent e){ if(e.getButton()==3){ if(e.getSource()==area){ pop.show(area,e.getX(),e.getY()); }else if(e.getSource()==field1){ pop.show(field1,e.getX(),e.getY()); } } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } }//该线程用来接收服务器发来的消息 class ClientThread extends Thread{ private InputStream in; JTextArea area; String user; public ClientThread(InputStream in,JTextArea area,String user){ this.in=in; this.area=area; this.user=user; } public void run(){ try { BufferedReader br=new BufferedReader(new InputStreamReader(in)); String line=null; while((line=br.readLine())!=null){ System.out.println("服务器发来的消息:"+line); String temp[]=line.split("-"); if(temp[0].equals("login")){ if(!(temp[1].equals(user))){ area.append(temp[1]+"上线啦!\n"); } }else if(temp[1].equals("全部人")){ if(!(temp[0].equals(user))){ area.append(temp[0]+"对全部人说:"+temp[2]+"\n"); } }else if(temp[1].equals(user)){//接受者恰好是自己 area.append(temp[0]+"对你说:"+temp[2]+"\n"); } } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }
②:代码:Server服务器服务器
import java.util.*; import java.io.*; import java.net.*; public class Server { static ServerSocket ser; InputStream in; OutputStream out; static Socket soc; public static void main(String[] args) { // TODO Auto-generated method stub int count=0;//统计链接客户端的个数 ArrayList all=new ArrayList();//建立一个容器,用来保存socket对象 try { ser=new ServerSocket(7890); while(true){ soc=ser.accept(); count++; //建立线程对象并开启 all.add(soc); System.out.println(count+"个链接成功"); new ServerThread(soc.getInputStream(),soc.getOutputStream(),all).start(); /*Thread t=new ServerThread(soc.getOutputStream()); t.start();*/ } } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace();} } } class ServerThread extends Thread{ //定义一个线程类,用来循环读取客户端发送过来的消息 private InputStream in; private OutputStream out; ArrayList all; public ServerThread(InputStream in,OutputStream out,ArrayList all){ this.in=in; this.out=out; this.all=all; } public void run(){ BufferedReader br=new BufferedReader(new InputStreamReader(in)); //BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out)); String line=null; try { while(true){ line=br.readLine(); // bw.write(line);//将客户端发来的消息再发回 // bw.newLine(); // bw.flush(); System.out.println("客户端:"+line); for(int i=0;i<all.size();i++){ Socket soc=(Socket) all.get(i); PrintWriter pr=new PrintWriter(soc.getOutputStream(),true); pr.println(line);//将客户端发来的消息再发回 } } } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } } }