java tcp点对点聊天程序(单人/多人)

来源:互联网 发布:好吉他淘宝 编辑:程序博客网 时间:2024/05/16 15:35

单点对单点,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() {@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif(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() {@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif(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() {@Overridepublic void actionPerformed(ActionEvent e) {msg = textField.getText();System.out.println(msg);// 这里不能用缓冲流,向服务器发送信息ps.println(msg);ps.flush();}});// 回车时,文本域事件textField.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {msg = textField.getText();// 这里不能用缓冲流写ps.println(msg);ps.flush();}});// 清屏按钮事件button_clear.addActionListener(new ActionListener() {@Overridepublic 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;}@Overridepublic void run() {try {br = new BufferedReader(new InputStreamReader(clientLink.getInputStream()));//获得当前用户的IPip=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();}}}}



 

 

原创粉丝点击