首页 > 编程 > Java > 正文

java实现简单聊天软件

2019-11-26 09:48:04
字体:
来源:转载
供稿:网友

本文为大家分享了java实现简单聊天软件的具体代码,供大家参考,具体内容如下

介绍

这是我自己学习Socket时写的,用到了多线程,Socket的知识,还有Java的IO技术,并且做了一个Java的UI,废话不多说,先上效果图

SendThread

这个类是用来实现数据的发送的,当按键按下时,会调用sendMessage方法

public class SendThread { ChatWindow chatWindow; private String remoteIP = ""; private int port = 0; private String message = ""; public SendThread(int port,ChatWindow window) {  chatWindow = window; } public void notRun() {  InetSocketAddress isa = new InetSocketAddress(remoteIP, port);  try {   Socket socket = new Socket();   socket.connect(isa);   OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());   writer.write(message);   writer.flush();   writer.close();   System.out.println("将数据写入到流中");  } catch (IOException e) {   e.printStackTrace();  }finally{   message = "";  } } public void senMessage(String host,int port,String message){  remoteIP = host;  this.port = port;  this.message = message;  notRun(); }}

ReceiveThread

这个类实现的功能是维护一个阻塞线程,来对端口进行监听,接受收到的信息,每当收到信息时,都会显示。

public class ReceiveThread extends Thread { private ServerSocket server; private ChatWindow window; public ReceiveThread(ChatWindow window) {  this.window = window;  try {   server = new ServerSocket(0);   window.setLocalPort(server.getLocalPort());   start();  } catch (IOException e) {   // TODO Auto-generated catch block   window.printError("连接出错");  } } @Override public void run() {  // TODO Auto-generated method stub  while(true){   Socket socket;   try {    socket = server.accept();    InputStreamReader reader = new InputStreamReader(socket.getInputStream());    int c;    StringBuilder sb = new StringBuilder();    while((c = reader.read()) != -1){     sb.append((char)c);    }    window.setReceive(sb.toString());   } catch (IOException e) {    // TODO Auto-generated catch block    System.out.println("线程将接受到的数据写入对话框出错");   }  } }}

ChatWindow

这个类是UI的实现,通过绑定各个按钮的操作来实现别的功能

public class ChatWindow extends JFrame { private JButton sendButton; private JButton cancelButton; private JButton receiveButton; private JTextArea receiveText; private JTextField sendText; private JLabel localPort; private JTextField remoteAddress; private JTextField remotePort; private SendThread sendThread; private ReceiveThread receiveThread; private void GUIini(){  Container c = this.getContentPane();  c.setLayout(new BorderLayout());  setSize(400, 500);  //第一个panel  JPanel panel1 = new JPanel(new GridLayout(4, 2));//  JPanel panel1 = new JPanel(new (4, 2));  panel1.setSize(400, 75);  panel1.add(new JLabel("当前机器的IP地址是:"));  try {   panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));  } catch (UnknownHostException e) {   // TODO Auto-generated catch block   panel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));  }  panel1.add(new JLabel("当前对话的端口是:"));  panel1.add(localPort = new JLabel(""+0));  panel1.add(new JLabel("Remote Host IP Address:"));  remoteAddress = new JTextField();  remoteAddress.setColumns(0);  panel1.add(remoteAddress);  panel1.add(new JLabel("Remote Host Port:"));  remotePort = new JTextField();  remotePort.setColumns(0);  panel1.add(remotePort);  c.add(panel1,BorderLayout.NORTH);  //第二个panel  JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEADING));  panel2.setSize(400,200);  panel2.add(new JLabel("收到的内容"));  receiveText = new JTextArea(15,30);  receiveText.setEditable(false);  receiveText.setAutoscrolls(true);  JScrollPane jsp = new JScrollPane(receiveText);  panel2.add(jsp);  //第三个panel//  JPanel panel3 = new JPanel(new GridLayout(2, 1));  panel2.add(new JLabel("请输入发送的内容"));  sendText = new JTextField(30);  sendText.setAutoscrolls(true);  panel2.add(sendText);  c.add(panel2,BorderLayout.CENTER);  //c.add(panel3);  //第四个panel  JPanel panel4 = new JPanel(new GridLayout(1, 0));  panel4.setSize(400,20);  receiveButton = new JButton("开始接受数据");  sendButton = new JButton("发送");  cancelButton = new JButton("取消");  panel4.add(receiveButton);  panel4.add(cancelButton);  panel4.add(sendButton);  c.add(panel4,BorderLayout.SOUTH);  //四个面板内容设置完毕  setVisible(true);  setResizable(false);  setDefaultCloseOperation(EXIT_ON_CLOSE); } private void ActionIni() {  //键盘动作  this.addKeyListener(new KeyListener() {   @Override   public void keyTyped(KeyEvent e) {   }   @Override   public void keyReleased(KeyEvent e) {    // TODO Auto-generated method stub    if(e.getKeyCode() == KeyEvent.VK_ENTER){     //发送文本     sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());     receiveText.setText(receiveText.getText() + "/n" + "发送:" + sendText.getText());    }   }   @Override   public void keyPressed(KeyEvent e) {    // TODO Auto-generated method stub   }  });  //取消按钮的动作  cancelButton.addMouseListener(new MouseListener() {   @Override   public void mouseReleased(MouseEvent e) {    // TODO Auto-generated method stub    sendText.setText("");   }   @Override   public void mousePressed(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseExited(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseEntered(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseClicked(MouseEvent e) {    // TODO Auto-generated method stub   }  });  sendButton.addMouseListener(new MouseListener() {   @Override   public void mouseReleased(MouseEvent e) {    //发送文本    sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());    receiveText.setText(receiveText.getText() + "发送:" + sendText.getText()+ "/n");   }   @Override   public void mousePressed(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseExited(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseEntered(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseClicked(MouseEvent e) {    // TODO Auto-generated method stub   }  }); } private void ThreadIni() {  // TODO Auto-generated method stub  sendThread = new SendThread(0, this);  receiveThread = new ReceiveThread(this); } //构造函数 public ChatWindow() {  GUIini();  ActionIni();  ThreadIni(); } public void printError(String err){  System.out.println("Error occur:" + err); } //回调函数,用于接受从线程中返回的数据 public void setReceive(String receive){  receiveText.setText(receiveText.getText() + "收到:" + receive+ "/n" ); } //当接受数据的线程开始工作以后,就调用该回调函数,设置当前聊天窗口使用的端口是哪个 public void setLocalPort(int localPortText){  localPort.setText(""+localPortText); } //放远,这个是整个程序的起点 public static void main(String[] args) {  // TODO Auto-generated method stub  new ChatWindow(); }}

如何使用

将工程导入到Eclipse中以后,运行两次,因为这个程序不属于单例模式,所以可以出现两个窗口,在远程端口,远程地址那个输入框中分别输入另一个窗口中显示的IP和端口号,接下来在输入框中输入要发送的文字就可以了

源码下载:java实现简单聊天软件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表