Java实现简单局域网聊天室

2025-05-29 0 63

本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下

Java 的Socket编程:

1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低

2、Java中基于TCP协议实现网络通信的类

  • 客户端的Socket类
  • 服务器端的ServerSocket类

Java实现简单局域网聊天室

3、Socket通信的步骤

① 创建ServerSocket和Socket

② 打开连接到Socket的输入/输出流

③ 按照协议对Socket进行读/写操作

④ 关闭输入输出流、关闭Socket

4、服务器端:

① 创建ServerSocket对象,绑定监听端口

② 通过accept()方法监听客户端请求

③ 连接建立后,通过输入流读取客户端发送的请求信息

④ 通过输出流向客户端发送乡音信息

⑤ 关闭相关资源

5、客户端:

① 创建Socket对象,指明需要连接的服务器的地址和端口号

② 连接建立后,通过输出流想服务器端发送请求信息

③ 通过输入流获取服务器响应的信息

④ 关闭响应资源

实现的聊天室例子:

实现的效果是如下:

Java实现简单局域网聊天室

服务端代码:

  1. package socket.server;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import java.util.ArrayList;
  8. /**
  9. * @author 超
  10. * Create by fengc on 2018/7/25 21:21
  11. */
  12. public class Server extends Thread{
  13. ServerUI ui;
  14. ServerSocket ss;
  15. BufferedReader reader;
  16. PrintWriter writer;
  17. public Server(ServerUI ui) {
  18. this.ui = ui;
  19. this.start();
  20. }
  21. @Override
  22. public void run() {
  23. try {
  24. ss = new ServerSocket(8081);
  25. ui.clients=new ArrayList<>();
  26. println("启动服务器成功:端口8081");
  27. while (true) {
  28. println("等待客户端链接…………………………………");
  29. Socket client = ss.accept();
  30. ui.clients.add(client);
  31. println("连接成功,客户端请求服务端的详细信息:" + client.toString());
  32. new ListenerClient(ui, client);
  33. }
  34. } catch (IOException e) {
  35. println("启动服务器失败:端口8081");
  36. println(e.toString());
  37. e.printStackTrace();
  38. }
  39. }
  40. public synchronized void sendMsg(String msg) {
  41. try {
  42. for (int i = 0; i < ui.clients.size(); i++) {
  43. Socket client = ui.clients.get(i);
  44. writer = new PrintWriter(client.getOutputStream(), true);
  45. writer.println(msg);
  46. }
  47. } catch (Exception e) {
  48. println(e.toString());
  49. }
  50. }
  51. public void println(String s) {
  52. if (s != null) {
  53. s = "服务端打印消息:" + s;
  54. this.ui.taShow.setText(this.ui.taShow.getText() + s + "\\n");
  55. System.out.println(s + "\\n");
  56. }
  57. }
  58. public void closeServer() {
  59. try {
  60. if (ss != null)
  61. ss.close();
  62. if (reader != null)
  63. reader.close();
  64. if (writer != null)
  65. writer.close();
  66. } catch (IOException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  1. package socket.server;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. /**
  8. * @author 超
  9. * Create by fengc on 2018/7/25 21:33
  10. * 这个类是服务器端的等待客户端发送信息*
  11. */
  12. public class ListenerClient extends Thread{
  13. BufferedReader reader;
  14. PrintWriter writer;
  15. ServerUI ui;
  16. Socket client;
  17. public ListenerClient(ServerUI ui, Socket client) {
  18. this.ui = ui;
  19. this.client=client;
  20. this.start();
  21. }
  22. //为每一个客户端创建线程等待接收信息,然后把信息广播出去
  23. @Override
  24. public void run() {
  25. String msg = "";
  26. while (true) {
  27. try {
  28. reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
  29. writer = new PrintWriter(client.getOutputStream(), true);
  30. msg = reader.readLine();
  31. sendMsg(msg);
  32. } catch (IOException e) {
  33. println(e.toString());
  34. break;
  35. }
  36. if (msg != null && msg.trim() != "") {
  37. println("客户端 " + msg);
  38. }
  39. }
  40. }
  41. //把信息广播到所有用户
  42. public synchronized void sendMsg(String msg) {
  43. try {
  44. for (int i = 0; i < ui.clients.size(); i++) {
  45. Socket client = ui.clients.get(i);
  46. writer = new PrintWriter(client.getOutputStream(), true);
  47. writer.println(msg);
  48. }
  49. } catch (Exception e) {
  50. println(e.toString());
  51. }
  52. }
  53. public void println(String s) {
  54. if (s != null) {
  55. this.ui.taShow.setText(this.ui.taShow.getText() + s + "\\n");
  56. System.out.println(s + "\\n");
  57. }
  58. }
  59. }
  1. package socket.server;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.WindowAdapter;
  7. import java.awt.event.WindowEvent;
  8. import java.net.Socket;
  9. import java.util.List;
  10. /**
  11. * @author 超
  12. * Create by fengc on 2018/7/25 21:21
  13. */
  14. public class ServerUI extends JFrame {
  15. public static void main(String[] args) {
  16. new ServerUI();
  17. }
  18. public JButton btStart;//启动服务器
  19. public JButton btSend;//发送信息按钮
  20. public JTextField tfSend;//需要发送的文本信息
  21. public JTextArea taShow;//信息展示
  22. public Server server;//用来监听客户端连接
  23. static List<Socket> clients;//保存连接到服务器的客户端
  24. public ServerUI() {
  25. super("服务器端");
  26. btStart = new JButton("启动服务");
  27. btSend = new JButton("发送信息");
  28. tfSend = new JTextField(10); //装在输入文字
  29. taShow = new JTextArea();
  30. //点击按钮,所做的是事情,启动服务器
  31. btStart.addActionListener(new ActionListener() {
  32. public void actionPerformed(ActionEvent e) {
  33. server = new Server(ServerUI.this);
  34. }
  35. });
  36. //点击发送消息按钮
  37. btSend.addActionListener(new ActionListener() {
  38. public void actionPerformed(ActionEvent e) {
  39. server.sendMsg(tfSend.getText());
  40. tfSend.setText("");
  41. }
  42. });
  43. //初始化界面
  44. this.addWindowListener(new WindowAdapter() {
  45. //关闭按钮点击事件
  46. public void windowClosing(WindowEvent e) {
  47. int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",
  48. JOptionPane.YES_NO_OPTION);
  49. if (a == 1) {
  50. server.closeServer();
  51. System.exit(0); // 关闭
  52. }
  53. }
  54. });
  55. //底部启动服务按钮与发送消息按钮
  56. JPanel top = new JPanel(new FlowLayout());
  57. top.add(tfSend);
  58. top.add(btSend);
  59. top.add(btStart);
  60. this.add(top, BorderLayout.SOUTH);
  61. //中部显示消息栏 信息展示
  62. final JScrollPane sp = new JScrollPane();
  63. sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  64. sp.setViewportView(this.taShow);
  65. this.taShow.setEditable(false);
  66. this.add(sp, BorderLayout.CENTER);
  67. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  68. this.setSize(400, 300);
  69. this.setLocation(100, 200);
  70. this.setVisible(true);
  71. }
  72. }

客户端代码:

  1. package socket.clinet;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. /**
  8. * @author 超
  9. * Create by fengc on 2018/7/25 21:41
  10. */
  11. public class Client extends Thread {
  12. ClientUI ui;
  13. Socket client;
  14. BufferedReader reader;
  15. PrintWriter writer;
  16. public Client(ClientUI ui) {
  17. this.ui = ui;
  18. try {
  19. String ip = ui.tfIP.getText(); //得到输入的ip地址
  20. int port = Integer.parseInt(ui.tfPort.getText()); //得到输入的端口
  21. client = new Socket(ip, port);//这里设置连接服务器端的IP的端口
  22. println("连接服务器成功,服务器端口地址:" + port);
  23. reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
  24. writer = new PrintWriter(client.getOutputStream(), true);
  25. String name = ui.tfName.getText();
  26. if (name == null || "".equals(name)) {
  27. name = "匿名者";
  28. }
  29. sendMsg("会员 " + name + ",登录上来了……………………");
  30. // 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
  31. } catch (NumberFormatException nu) {
  32. println("端口请输入正确…….");
  33. nu.printStackTrace();
  34. } catch (IOException e) {
  35. println("连接服务器失败:请输入正确的IP地址与端口");
  36. println(e.toString());
  37. e.printStackTrace();
  38. }
  39. this.start();
  40. }
  41. public void run() {
  42. String msg = "";
  43. while (true) {
  44. try {
  45. msg = reader.readLine();
  46. } catch (IOException e) {
  47. println("服务器断开连接");
  48. break;
  49. }
  50. if (msg != null && msg.trim() != "") {
  51. println(msg);
  52. }
  53. }
  54. }
  55. public void sendMsg(String msg) {
  56. try {
  57. writer.println(msg);
  58. } catch (Exception e) {
  59. println(e.toString());
  60. }
  61. }
  62. public void println(String s) {
  63. if (s != null) {
  64. this.ui.taShow.setText(this.ui.taShow.getText() + s + "\\n");
  65. System.out.println(s + "\\n");
  66. }
  67. }
  68. }
  1. package socket.clinet;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.WindowAdapter;
  7. import java.awt.event.WindowEvent;
  8. /**
  9. * @author 超
  10. * Create by fengc on 2018/7/25 21:40
  11. */
  12. public class ClientUI extends JFrame {
  13. public static void main(String[] args) {
  14. new ClientUI();
  15. }
  16. public JButton btStart;
  17. public JButton btSend;
  18. public JTextField tfSend; //装在输入文字
  19. public JTextPane nameText; //输入名字
  20. public JTextPane ipTex; //输入名字
  21. public JTextPane portText; //输入名字
  22. public JTextField tfName; //服务器ip
  23. public JTextField tfIP; //服务器ip
  24. public JTextField tfPort; //服务器端口
  25. public JTextArea taShow;
  26. public Client server;
  27. public ClientUI() {
  28. super("客户端");
  29. btStart = new JButton("启动连接");
  30. btSend = new JButton("发送信息");
  31. tfSend = new JTextField(20);
  32. tfIP = new JTextField(8);
  33. tfPort = new JTextField(3);
  34. tfName = new JTextField(6);
  35. nameText = new JTextPane();nameText.setText("登录名");nameText.setEditable(false);
  36. ipTex = new JTextPane();ipTex.setText("服务地址");ipTex.setEditable(false);
  37. portText = new JTextPane();portText.setText("服务端口");portText.setEditable(false);
  38. taShow = new JTextArea();
  39. //启动链接按钮事件
  40. btStart.addActionListener(new ActionListener() {
  41. public void actionPerformed(ActionEvent e) {
  42. server = new Client(ClientUI.this);
  43. }
  44. });
  45. //发送按钮事件
  46. btSend.addActionListener(new ActionListener() {
  47. public void actionPerformed(ActionEvent e) {
  48. String name = tfName.getText();
  49. if (name == null || "".equals(name)) {
  50. name = "匿名者";
  51. }
  52. server.sendMsg(name + ":" + tfSend.getText());
  53. tfSend.setText("");
  54. }
  55. });
  56. this.addWindowListener(new WindowAdapter() {
  57. public void windowClosing(WindowEvent e) {
  58. int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",
  59. JOptionPane.YES_NO_OPTION);
  60. if (a == 1) {
  61. System.exit(0); // 关闭
  62. }
  63. }
  64. });
  65. //底部的发送信息框与链接按钮
  66. JPanel top = new JPanel(new FlowLayout());
  67. top.add(tfSend); //发送文本
  68. top.add(btSend); //发送按钮
  69. this.add(top, BorderLayout.SOUTH); //加载到底部
  70. //头部放连接服务的
  71. JPanel northJpannel = new JPanel(new FlowLayout());
  72. northJpannel.add(nameText);
  73. northJpannel.add(tfName);
  74. northJpannel.add(ipTex);
  75. northJpannel.add(tfIP);
  76. northJpannel.add(portText);
  77. northJpannel.add(tfPort);
  78. northJpannel.add(btStart);
  79. this.add(northJpannel,BorderLayout.NORTH); //加载到头部
  80. final JScrollPane sp = new JScrollPane();
  81. sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  82. sp.setViewportView(this.taShow);
  83. this.taShow.setEditable(false);
  84. this.add(sp, BorderLayout.CENTER);
  85. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  86. this.setSize(500, 400);
  87. this.setLocation(600, 200);
  88. this.setVisible(true);
  89. }
  90. }

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

原文链接:https://blog.csdn.net/yundanfengqingfeng/article/details/81212632

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java实现简单局域网聊天室 https://www.kuaiidc.com/105987.html

相关文章

发表评论
暂无评论