单点对单点,enter键不是button,而是使用keylistener事件keyadapter适配器
客户端代码:
package chatroom; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class Clients extends JFrame{ private static JTextField jField; private static JTextArea jArea; private static JPanel jPanel; private static String message; private static BufferedReader is; private static PrintWriter os; StringBuffer sb = new StringBuffer(); public Clients() { super("客户端"); } public void runClients() throws IOException { initcompent(); Socket socket=new Socket(InetAddress.getLocalHost(),10002); JOptionPane.showMessageDialog(null, "connect"); is=new BufferedReader(new InputStreamReader(socket.getInputStream(),"gb2312")); os=new PrintWriter(socket.getOutputStream()); jField.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if(e.getKeyCode()==KeyEvent.VK_ENTER){ message=jField.getText(); if(message.compareTo("")==0) { JOptionPane.showMessageDialog(null,"null,please input again!"); } else { JOptionPane.showMessageDialog(null, "Been sent!"); os.println(message); os.flush(); } } } }); while(true){ String str=is.readLine(); sb.append(str+"\n"); jArea.setText(sb.toString()); jField.setText(""); } } public void initcompent() { this.setLayout(null); jPanel=new JPanel(); jPanel.setLayout(null); this.setContentPane(jPanel); jField=new JTextField(); jField.setBounds(20, 10, 350, 30); jPanel.add(jField); jArea=new JTextArea(); jArea.setBounds(20, 50, 350, 300); jPanel.add(jArea); Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize(); this.setPreferredSize(new Dimension(400,400)); this.setBounds(screensize.width/2-200, screensize.height/2-200, 400, 400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setResizable(false); } public static void main(String[] args) throws IOException { new Clients().runClients(); } }
服务器端:
package chatroom; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class Severs extends JFrame{ private static JTextField jField; private static JTextArea jArea; private static JPanel jPanel; private static String message; private static ServerSocket server; private static Socket socket; private static BufferedReader is; private static PrintWriter os; StringBuffer sb = new StringBuffer(); public Severs() { super("服务器"); } public void runSevers() throws IOException { initcompent(); server=new ServerSocket(10002); socket=server.accept(); is=new BufferedReader(new InputStreamReader(socket.getInputStream(),"gb2312")); os=new PrintWriter(socket.getOutputStream()); JOptionPane.showMessageDialog(null, "waitting clients"); jField.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if(e.getKeyCode()==KeyEvent.VK_ENTER){ message=jField.getText(); if(message.compareTo("")==0) { JOptionPane.showMessageDialog(null,"null,please input again!"); } else { JOptionPane.showMessageDialog(null, "Been sent!"); os.println(message); os.flush(); } } } }); while(true){ String str=is.readLine(); sb.append(str+"\n"); jArea.setText(sb.toString()); jField.setText(""); } } public void initcompent() { this.setLayout(null); jPanel=new JPanel(); jPanel.setLayout(null); this.setContentPane(jPanel); jField=new JTextField(); jField.setBounds(20, 10, 350, 30); jPanel.add(jField); jArea=new JTextArea(); jArea.setBounds(20, 50, 350, 300); jPanel.add(jArea); Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize(); this.setPreferredSize(new Dimension(400,400)); this.setBounds(screensize.width/2-200, screensize.height/2-200, 400, 400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setResizable(false); } public static void main(String[] args) throws IOException { new Severs().runSevers(); } }
实现多人聊天,只是附加了服务器线程:
客户端:
import java.awt.BorderLayout; import java.awt.Button; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JFrame; @SuppressWarnings("serial") public class Client extends JFrame { TextArea textArea = new TextArea();// 创建一个文本域 TextField textField = new TextField();// 创建一个文本框 Button button_send = new Button("发送"); Button button_clear = new Button("清屏"); static Socket clientLink; BufferedReader br; PrintStream ps; String msg; StringBuffer sb = new StringBuffer(); static { try { clientLink = new Socket("127.0.0.1",8888); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public Client() { super("客户端"); } public void runClient() { this.setLocation(400, 450); this.setSize(400, 400); this.add(textArea, BorderLayout.NORTH);// 把文本添加到窗体中 this.add(textField, BorderLayout.SOUTH);// 把文本框添加到窗体中 this.add(button_send, BorderLayout.EAST);// 把按钮添加到窗体中 this.add(button_clear, BorderLayout.WEST); this.setVisible(true);// 窗体是否可见 this.pack();// 自动调整布局 textField.setText("请输入信息"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { br = new BufferedReader(new InputStreamReader(clientLink .getInputStream())); ps = new PrintStream(clientLink.getOutputStream()); // 发送按钮事件 button_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { msg = textField.getText(); System.out.println(msg); // 这里不能用缓冲流,向服务器发送信息 ps.println(msg); ps.flush(); } }); // 回车时,文本域事件 textField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { msg = textField.getText(); // 这里不能用缓冲流写 ps.println(msg); ps.flush(); } }); // 清屏按钮事件 button_clear.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { textArea.setText(""); sb.delete(0, sb.length()); } }); // 接受服务器信息 while (true) { msg = br.readLine(); sb.append(msg + "\n"); textArea.setText(sb.toString()); textField.setText(""); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != clientLink) { clientLink.close(); } if (null != br) { br.close(); } if (null != ps) { ps.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new Client().runClient(); } }
服务器端:
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { static ServerSocket server; Socket clientLink; List<Socket> clientLinkList = new ArrayList<Socket>(); int count; static { try { // 开启服务器 server = new ServerSocket(8888); System.out.println("服务器已启动!"); } catch (IOException e) { e.printStackTrace(); } } public void runServer() { try { while (true) { clientLink = server.accept(); System.out.println("连接数:" + (++count)); clientLinkList.add(clientLink); ServerThread st = new ServerThread(clientLinkList, clientLink); new Thread(st).start(); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.runServer(); } }
服务器线程代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.util.List; public class ServerThread implements Runnable { List<Socket> clientLinkList; Socket clientLink; BufferedReader br; PrintStream ps; String msg; String ip; public ServerThread(List<Socket> clientLinkList, Socket clientLink) { this.clientLinkList = clientLinkList; this.clientLink = clientLink; } @Override public void run() { try { br = new BufferedReader(new InputStreamReader(clientLink .getInputStream())); //获得当前用户的IP ip=clientLink.getInetAddress().getHostAddress(); //把当前用户发来的信息发送给所有用户. while (null != (msg=br.readLine())) { for (int i = 0; i < clientLinkList.size(); i++) { ps = new PrintStream(clientLinkList.get(i) .getOutputStream()); ps.println("IP为:"+ip+"的朋友说:"+msg+"\n"); ps.flush(); } } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(null!=clientLink){ clientLink.close(); } if(null!=br){ br.close(); } if(null!=ps){ ps.close(); } } catch (IOException e) { e.printStackTrace(); } } } }