时间:2021-05-19
本文实例为大家分享了java局域网聊天程序的具体代码,供大家参考,具体内容如下
有服务器端 和客户端两个界面,运行需要加上自己的ip地址,端口可以随意,但是客户端端口,和服务器端口要一样,然后就可以几个人一块聊天了
简单贴几个代码吧
Client.java 客户端代码
package chat; import java.awt.BorderLayout;//布置容器的边框布局import java.awt.Color;import java.awt.Container;import java.awt.GridLayout;//布局处理器import java.awt.Toolkit;//抽象超类import java.awt.event.ActionEvent;//指示发生了组件定义的动作的语义事件import java.awt.event.ActionListener;//用于接收操作事件的侦听器接口import java.awt.event.MouseEvent;//指示组件中发生鼠标动作的事件import java.awt.event.MouseListener;//鼠标事件的侦听器接口import java.awt.event.WindowAdapter;//接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象import java.awt.event.WindowEvent;//指示窗口状态改变的低级别事件import java.io.BufferedReader;//提供通用的缓冲方式文本读取import java.io.IOException;//输入输出异常import java.io.InputStreamReader;//字节流通向字符流的桥梁import java.io.PrintWriter;//向文本输出流打印对象的格式化表示形式import java.net.Socket;//套接字,网络上的两个程序通过一个双向的通信连接实现数据交换的通信import java.util.HashMap;// HashMap 是 Map 接口的常用实现类import java.util.Map;//存数据,将键映射到值的对象import java.util.StringTokenizer;//允许应用程序将字符串分解为标记 import javax.swing.BorderFactory;//创建一个浮雕式的边框import javax.swing.DefaultListModel;//列表模型import javax.swing.JButton;//按钮import javax.swing.JFrame;//窗口import javax.swing.JLabel;//标签import javax.swing.JList;//列表import javax.swing.JOptionPane;//对话框import javax.swing.JPanel;import javax.swing.JScrollPane;//视图import javax.swing.JSplitPane;//分隔import javax.swing.JTextArea;//多行文本import javax.swing.JTextField;//文本import javax.swing.border.EmptyBorder;//一个占用空间但不执行绘制的空透明边框import javax.swing.border.TitledBorder;//该类实现在指定位置以指定对齐方式显示字符串标题的任意边框 import oldchat.ChatFrame; public class Client{ private JFrame frame; private JList userList; private JTextArea textArea; private JTextField textField; private JTextField txt_port; private JTextField txt_hostIp; private JTextField txt_name; private JButton btn_start; private JButton btn_stop; private JButton btn_send; private JPanel northPanel; private JPanel southPanel; private JScrollPane rightScroll; private JScrollPane leftScroll; private JSplitPane centerSplit; private DefaultListModel listModel; private boolean isConnected = false; private Socket socket;//创建套接字 private PrintWriter writer; private BufferedReader reader; private MessageThread messageThread;// 负责接收消息的线程 private Map<String, User> onLineUsers = new HashMap<String, User>();// 所有在线用户 // 主方法,程序入口 public static void main(String[] args) { new Client(); } // 执行发送 public void send() { if (!isConnected) { JOptionPane.showMessageDialog(frame, "还没有连接服务器,无法发送消息!", "错误", JOptionPane.ERROR_MESSAGE); return; } String message = textField.getText().trim(); if (message == null || message.equals("")) { JOptionPane.showMessageDialog(frame, "消息不能为空!", "错误", JOptionPane.ERROR_MESSAGE); return; } sendMessage(frame.getTitle() + "@" + "ALL" + "@" + message); textField.setText(null); } // 构造方法 public Client() { textArea = new JTextArea(); textArea.setEditable(false); textArea.setForeground(Color.blue); textField = new JTextField(); txt_port = new JTextField("6666"); txt_hostIp = new JTextField(); txt_name = new JTextField(); btn_start = new JButton("连接"); btn_stop = new JButton("断开"); btn_send = new JButton("发送"); listModel = new DefaultListModel(); userList = new JList(listModel); northPanel = new JPanel(); northPanel.setLayout(new GridLayout(1, 7)); northPanel.add(new JLabel("端口")); northPanel.add(txt_port); northPanel.add(new JLabel("服务器IP")); northPanel.add(txt_hostIp); northPanel.add(new JLabel("姓名")); northPanel.add(txt_name); northPanel.add(btn_start); northPanel.add(btn_stop); northPanel.setBorder(new TitledBorder("连接信息")); rightScroll = new JScrollPane(textArea); rightScroll.setBorder(new TitledBorder("群聊消息显示区")); leftScroll = new JScrollPane(userList); leftScroll.setBorder(new TitledBorder("在线用户(双击私聊)")); southPanel = new JPanel(new BorderLayout()); southPanel.add(textField, "Center"); southPanel.add(btn_send, "East"); southPanel.setBorder(new TitledBorder("写消息")); centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll, rightScroll); centerSplit.setDividerLocation(100); frame = new JFrame("客户端"); // 更改JFrame的图标: //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.jpg"))); frame.setLayout(new BorderLayout()); frame.add(northPanel, "North"); frame.add(centerSplit, "Center"); frame.add(southPanel, "South"); frame.setSize(600, 400); int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height; frame.setLocation((screen_width - frame.getWidth()) / 2, (screen_height - frame.getHeight()) / 2); frame.setVisible(true); // 写消息的文本框中按回车键时事件 textField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { send(); } }); // 单击发送按钮时事件 btn_send.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { send(); } }); // 单击连接按钮时事件 btn_start.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int port; if (isConnected) { JOptionPane.showMessageDialog(frame, "已处于连接上状态,不要重复连接!", "错误", JOptionPane.ERROR_MESSAGE); return; } try { try { port = Integer.parseInt(txt_port.getText().trim()); } catch (NumberFormatException e2) { throw new Exception("端口号不符合要求!端口为整数!"); } String hostIp = txt_hostIp.getText().trim(); String name = txt_name.getText().trim(); if (name.equals("") || hostIp.equals("")) { throw new Exception("姓名、服务器IP不能为空!"); } boolean flag = connectServer(port, hostIp, name); if (flag == false) { throw new Exception("与服务器连接失败!"); } frame.setTitle(name); JOptionPane.showMessageDialog(frame, "成功连接!"); } catch (Exception exc) { JOptionPane.showMessageDialog(frame, exc.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } });//双击聊天(私聊) userList.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2) { User user=onLineUsers.get(userList.getSelectedValue()); ChatFrame.main(user.getIp());; } } }); // 单击断开按钮时事件 btn_stop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!isConnected) { JOptionPane.showMessageDialog(frame, "已处于断开状态,不要重复断开!", "错误", JOptionPane.ERROR_MESSAGE); return; } try { boolean flag = closeConnection();// 断开连接 if (flag == false) { throw new Exception("断开连接发生异常!"); } JOptionPane.showMessageDialog(frame, "成功断开!"); } catch (Exception exc) { JOptionPane.showMessageDialog(frame, exc.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } }); // 关闭窗口时事件 frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (isConnected) { closeConnection();// 关闭连接 } System.exit(0);// 退出程序 } }); } /** * 连接服务器 * * @param port * @param hostIp * @param name */ public boolean connectServer(int port, String hostIp, String name) { // 连接服务器 try { socket = new Socket(hostIp, port);// 根据端口号和服务器ip建立连接 writer = new PrintWriter(socket.getOutputStream()); reader = new BufferedReader(new InputStreamReader(socket .getInputStream())); // 发送客户端用户基本信息(用户名和ip地址) sendMessage(name + "@" + socket.getLocalAddress().toString()); // 开启接收消息的线程 messageThread = new MessageThread(reader, textArea); messageThread.start(); isConnected = true;// 已经连接上了 return true; } catch (Exception e) { textArea.append("与端口号为:" + port + " IP地址为:" + hostIp + " 的服务器连接失败!" + "\r\n"); isConnected = false;// 未连接上 return false; } } /** * 发送消息 * * @param message */ public void sendMessage(String message) { writer.println(message); writer.flush(); } /** * 客户端主动关闭连接 */ @SuppressWarnings("deprecation") public synchronized boolean closeConnection() { try { sendMessage("CLOSE");// 发送断开连接命令给服务器 messageThread.stop();// 停止接受消息线程 // 释放资源 if (reader != null) { reader.close(); } if (writer != null) { writer.close(); } if (socket != null) { socket.close(); } isConnected = false; return true; } catch (IOException e1) { e1.printStackTrace(); isConnected = true; return false; } } // 不断接收消息的线程 class MessageThread extends Thread { private BufferedReader reader; private JTextArea textArea; // 接收消息线程的构造方法 public MessageThread(BufferedReader reader, JTextArea textArea) { this.reader = reader; this.textArea = textArea; } // 被动的关闭连接 public synchronized void closeCon() throws Exception { // 清空用户列表 listModel.removeAllElements(); // 被动的关闭连接释放资源 if (reader != null) { reader.close(); } if (writer != null) { writer.close(); } if (socket != null) { socket.close(); } isConnected = false;// 修改状态为断开 } public void run() { String message = ""; while (true) { try { message = reader.readLine(); StringTokenizer stringTokenizer = new StringTokenizer(message, "/@"); String command = stringTokenizer.nextToken();// 命令 if (command.equals("CLOSE"))// 服务器已关闭命令 { textArea.append("服务器已关闭!\r\n"); closeCon();// 被动的关闭连接 return;// 结束线程 } else if (command.equals("ADD")) {// 有用户上线更新在线列表 String username = ""; String userIp = ""; if ((username = stringTokenizer.nextToken()) != null && (userIp = stringTokenizer.nextToken()) != null) { User user = new User(username, userIp); onLineUsers.put(username, user); listModel.addElement(username); } } else if (command.equals("DELETE")) {// 有用户下线更新在线列表 String username = stringTokenizer.nextToken(); User user = (User) onLineUsers.get(username); onLineUsers.remove(user); listModel.removeElement(username); } else if (command.equals("USERLIST")) {// 加载在线用户列表 int size = Integer .parseInt(stringTokenizer.nextToken()); String username = null; String userIp = null; for (int i = 0; i < size; i++) { username = stringTokenizer.nextToken(); userIp = stringTokenizer.nextToken(); User user = new User(username, userIp); onLineUsers.put(username, user); listModel.addElement(username); } } else if (command.equals("MAX")) {// 人数已达上限 textArea.append(stringTokenizer.nextToken() + stringTokenizer.nextToken() + "\r\n"); closeCon();// 被动的关闭连接 JOptionPane.showMessageDialog(frame, "服务器缓冲区已满!", "错误", JOptionPane.ERROR_MESSAGE); return;// 结束线程 } else {// 普通消息 textArea.append(message + "\r\n"); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } } }Server.java
运行截图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在Qt局域网聊天程序的到的东西太多了,最想和大家分享的是关于局域网聊天信息的冒泡,他的设计也不是特别难,我写了一个类分享给大家。可能各位道友有更好的办法,但希望
用最简单的代码编写局域网聊天程序打开易语言程序新建一个窗口程序在窗口中添加一个客户端组件、一个服务端组件、一个发送按钮和2个文本框,如下图所示。将服务器的端口改
在局域网中能干些什么?只能玩游戏吗?你out了,在局域网中只要有excel就能聊天了哦!你不知道了吧! 现在多数单位都组建了局域网,虽然有不少能在局域网上聊天
相信那些很熟悉电脑应用工具的朋友一定知道局域网中聊天除了使用聊天工具以外,还可以用TXT记事本来实现,那如何利用TXT记事本在局域网中聊天?请看以下的应用小技巧
在局域网中能干些什么?只能玩游戏吗?你out了,在局域网中只要有excel就能聊天了哦!你不知道了吧! 现在多数单位都组建了局域网,虽然有不少能在局域网上