Java网络编程,通过TCP,Socket实现多对一的局域网聊天室
来源:互联网 发布:ubuntu 进入根目录 编辑:程序博客网 时间:2024/05/16 07:30
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:183993990 我们一起学Java!
java网络编程,通过TCP,Socket实现多对一的局域网聊天室
可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端
这是服务器端的代码
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); }}
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(); } }}
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"); } }}
客户端代码
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; }
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学习交流群,群号码:183993990 我们一起学Java!
1 0
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室 .
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- Java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- Java一步一脚印—通过简单的TCP网络编程实现局域网的聊天对话
- Java 网络编程(TCP)实现服务器与客户端1对多的随意顺 序的聊天室
- Java——多人聊天室(基于TCP的网络编程——Socket)
- Java使用socket网络编程实现多人聊天室
- Java使用socket网络编程实现多人聊天室
- Java—网络编程实现UDP聊天室(局域网)
- Java 网络:InetAddress类的应用以及通过Socket实现TCP编程
- java通过Socket实现TCP网络通信
- 14 QT TCP网络编程与网络聊天室的实现
- JAVA 通过 Socket 实现 TCP 编程
- Java通过Socket实现TCP编程
- JAVA 通过 Socket 实现 TCP 编程
- JAVA 通过 Socket 实现 TCP 编程
- JAVA 通过 Socket 实现 TCP 编程
- react native listView(1) 加载网络数据简单版
- 几个常见的 Socket 连接错误及原因[转]
- 常用mysql自带内置函数说明&相似对比
- try catch
- iOS/Objective-C开发 枚举(Enum)的使用
- Java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- Mac 终端Mysql路径设置
- HDU 4751 Divide Groups(二分图判断)
- 使用Glide动态加载圆形图片跟圆角图片
- 动态线程中获取spring dao或者service
- 分布式系统事务一致性解决方案
- android studio文件工程夹过大,generated文件夹过大解决方法
- C++ STL的严格弱序(strict weak ordering)
- 简单聊聊设计