java网络编程,通过TCP,Socket实现多对一的局域网聊天室
可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端
这是服务器端的代码
View Code
import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.Socket; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /*这个类是服务器端的UI*/ public class ServerUI extends JFrame { public static void main(String[] args) { ServerUI serverUI = new ServerUI(); } public JButton btStart;//启动服务器 public JButton btSend;//发送信息按钮 public JTextField tfSend;//需要发送的文本信息 public JTextArea taShow;//信息展示 public Server server;//用来监听客户端连接 static List<Socket> clients;//保存连接到服务器的客户端 public ServerUI() { super("服务器端"); btStart = new JButton("启动服务"); btSend = new JButton("发送信息"); tfSend = new JTextField(10); taShow = new JTextArea(); btStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { server = new Server(ServerUI.this); } }); btSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { server.sendMsg(tfSend.getText()); tfSend.setText(""); } }); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示", JOptionPane.YES_NO_OPTION); if (a == 1) { server.closeServer(); System.exit(0); // 关闭 } } }); JPanel top = new JPanel(new FlowLayout()); top.add(tfSend); top.add(btSend); top.add(btStart); this.add(top, BorderLayout.SOUTH); final JScrollPane sp = new JScrollPane(); sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); sp.setViewportView(this.taShow); this.taShow.setEditable(false); this.add(sp, BorderLayout.CENTER); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(400, 300); this.setLocation(100, 200); this.setVisible(true); } }
View Code
import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; /*这个类是服务器端的等待客户端连接*/ public class Server extends Thread { ServerUI ui; ServerSocket ss; BufferedReader reader; PrintWriter writer; public Server(ServerUI ui) { this.ui = ui; this.start(); } public void run() { try { ss = new ServerSocket(1228); ui.clients=new ArrayList<Socket>(); println("启动服务器成功:端口1228"); while (true) { println("等待客户端"); Socket client = ss.accept(); ui.clients.add(client); println("连接成功" + client.toString()); new ListenerClient(ui, client); } } catch (IOException e) { println("启动服务器失败:端口1228"); println(e.toString()); e.printStackTrace(); } } public synchronized void sendMsg(String msg) { try { for (int i = 0; i < ui.clients.size(); i++) { Socket client = ui.clients.get(i); writer = new PrintWriter(client.getOutputStream(), true); writer.println(msg); } } catch (Exception e) { println(e.toString()); } } public void println(String s) { if (s != null) { this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n"); System.out.println(s + "\n"); } } public void closeServer() { try { if (ss != null) ss.close(); if (reader != null) reader.close(); if (writer != null) writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
View Code
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /*这个类是服务器端的等待客户端发送信息*/ public class ListenerClient extends Thread { BufferedReader reader; PrintWriter writer; ServerUI ui; Socket client; public ListenerClient(ServerUI ui, Socket client) { this.ui = ui; this.client=client; this.start(); } //为每一个客户端创建线程等待接收信息,然后把信息广播出去 public void run() { String msg = ""; while (true) { try { reader = new BufferedReader(new InputStreamReader( client.getInputStream())); writer = new PrintWriter(client.getOutputStream(), true); msg = reader.readLine(); sendMsg(msg); } catch (IOException e) { println(e.toString()); // e.printStackTrace(); break; } if (msg != null && msg.trim() != "") { println(">>" + msg); } } } //把信息广播到所有用户 public synchronized void sendMsg(String msg) { try { for (int i = 0; i < ui.clients.size(); i++) { Socket client = ui.clients.get(i); writer = new PrintWriter(client.getOutputStream(), true); writer.println(msg); } } catch (Exception e) { println(e.toString()); } } public void println(String s) { if (s != null) { this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n"); System.out.println(s + "\n"); } } }
客户端代码
View Code
import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class ClientUI extends JFrame { public static void main(String[] args) { ClientUI client = new ClientUI(); } public ClientUI() { super("客户端"); btStart = new JButton("启动连接"); btSend = new JButton("发送信息"); tfSend = new JTextField(10); tfIP = new JTextField(10); tfPost = new JTextField(5); taShow = new JTextArea(); btStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { server = new ClientThread(ClientUI.this); } }); btSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { server.sendMsg(tfSend.getText()); tfSend.setText(""); } }); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示", JOptionPane.YES_NO_OPTION); if (a == 1) { System.exit(0); // 关闭 } } }); JPanel top = new JPanel(new FlowLayout()); top.add(tfSend); top.add(btSend); top.add(btStart); this.add(top, BorderLayout.SOUTH); final JScrollPane sp = new JScrollPane(); sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); sp.setViewportView(this.taShow); this.taShow.setEditable(false); this.add(sp, BorderLayout.CENTER); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(400, 300); this.setLocation(600, 200); this.setVisible(true); } public JButton btStart; public JButton btSend; public JTextField tfSend; public JTextField tfIP; public JTextField tfPost; public JTextArea taShow; public ClientThread server; }
View Code
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ClientThread extends Thread { ClientUI ui; Socket client; BufferedReader reader; PrintWriter writer; public ClientThread(ClientUI ui) { this.ui = ui; try { client = new Socket("127.0.0.1", 1228);//这里设置连接服务器端的IP的端口 println("连接服务器成功:端口1228"); reader = new BufferedReader(new InputStreamReader( client.getInputStream())); writer = new PrintWriter(client.getOutputStream(), true); // 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区 } catch (IOException e) { println("连接服务器失败:端口1228"); println(e.toString()); e.printStackTrace(); } this.start(); } public void run() { String msg = ""; while (true) { try { msg = reader.readLine(); } catch (IOException e) { println("服务器断开连接"); break; } if (msg != null && msg.trim() != "") { println(">>" + msg); } } } public void sendMsg(String msg) { try { writer.println(msg); } catch (Exception e) { println(e.toString()); } } public void println(String s) { if (s != null) { this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n"); System.out.println(s + "\n"); } } }
相关推荐
广工 java与计算机网络的作业大作业,java聊天室,需要的自取
Java代码写的基于TCP和Socket编程的局域网多线程多人聊天室(Java网络编程)实训小例子。
通过分析和运行这些源码,开发者可以学习到如何在Java中实现一个基本的局域网聊天应用,了解Socket通信的基本步骤,以及如何处理并发连接、错误处理等高级话题。这样的项目对于理解网络编程和提高Java编程技能非常有...
总之,JAVA局域网聊天室项目涵盖了JAVA基础、网络编程、多线程、数据序列化和GUI设计等多个方面的知识,对于初学者来说,这是一个很好的实践平台,能提升对JAVA编程的整体理解和应用能力。通过实际操作,不仅可以...
【局域网聊天室java源代码】是一种基于Java编程语言实现的本地网络通信应用,它允许在同一局域网内的用户进行实时的文本聊天。这个项目的核心在于利用Java的Socket编程来构建客户端和服务器端的通信架构,实现了基本...
总结来说,基于C++的Winsock局域网聊天室程序设计涉及了网络编程的基本概念、Winsock API的使用、TCP协议的原理、多线程编程以及用户界面设计等多个方面。通过这个项目,不仅可以深入理解网络通信的底层机制,也能...
详细的博客描述:https://blog.csdn.net/qq_43757282/article/details/108694697 此资源包括源代码和可执行的exe文件。
基于TCP SOCKET实现的局域网聊天室
总的来说,这个资源对于想要学习Java网络编程,特别是局域网聊天室实现的人来说,是非常有价值的。通过阅读源代码,可以学习如何使用Java Socket进行网络通信,如何设计多线程模型来处理并发的客户端请求,以及如何...
【JAVA局域网聊天室源码】是一个基于Java编程语言实现的本地网络通信项目,它允许在同一局域网内的用户通过简单的客户端-服务器架构进行实时的文本聊天。这个项目主要包含两个核心部分:ChatServer(服务器端)和...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库进行网络编程,以实现一个局域网聊天室软件。MFC是微软提供的一种C++类库,它简化了Windows应用程序的开发,而结合网络编程则可以构建出功能...
通过理解以上知识点,并结合提供的源代码(基于Socket的局域网聊天室系统),开发者可以学习到如何构建一个简单的聊天室应用,并进一步扩展其功能,如添加文件传输、群组聊天、用户权限管理等特性,提升系统的实用性...
总之,这个Java局域网聊天室项目涵盖了网络编程、GUI设计、文件操作等多个核心Java知识点,是学习和实践Java技术的好案例。通过对该项目的深入理解和实践,开发者可以提升自己的技能,尤其是在构建分布式系统和网络...
【基于Socket的局域网聊天系统】是一种简易的通信应用,它允许在同一局域网内的多个用户进行实时的多对多对话。这个系统的核心技术是Socket编程,它是网络编程的基础,用于建立网络连接并进行数据交换。在此系统中,...
总的来说,这个“C++控制台局域网聊天室”项目涵盖了C++编程基础、网络编程基本概念、SOCKET接口的使用以及多线程处理等核心知识点,是一个不错的学习和实践平台。通过实际操作,开发者可以深入理解网络通信的原理,...
Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,它利用了Socket接口来构建一个局域网内的多人聊天环境,类似于QQ群的功能。在这个项目中,开发者运用了多线程技术来处理并发的用户交互,同时利用...
【标题】"基于C#的局域网聊天室"是一个项目,它利用C#编程语言在局域网环境中实现了一款简单的聊天应用。这个聊天室允许在同一网络中的多个设备之间进行实时通信,使得用户可以相互发送消息。 【描述】"基于C#的...
局域网聊天室软件,是一种基于VC++编程语言,并采用socket通信技术实现的多用户交互系统。它为用户提供了一个在局域网内部进行实时交流的平台,尤其适合初学者学习网络编程和VC++的应用。以下将对这一软件的核心知识...
TCP局域网聊天系统是一种基于传输控制协议(TCP)实现的通信系统,它允许在同一局域网内的设备之间进行实时的文本或数据交换。在这个系统中,通常包括两个主要组件:服务器(TCPServer.java)和客户端(TCPClient....
【Java局域网聊天室(J2SE 窗体)】是一个基于Java编程语言的桌面应用程序,它利用Java的J2SE(Java 2 Standard Edition)平台构建,专为局域网内的用户提供实时通信功能。这个项目展示了Java在创建网络应用,特别是...