Java实现简单局域网聊天室

本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下
Java 的Socket编程:
1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
2、Java中基于TCP协议实现网络通信的类

  • 客户端的Socket类
  • 服务器端的ServerSocket类
Java实现简单局域网聊天室
文章图片

3、Socket通信的步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
4、服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
5、客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
实现的聊天室例子:
实现的效果是如下:
Java实现简单局域网聊天室
文章图片

服务端代码:
package socket.server; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; /** * @author 超 * Create by fengc on2018/7/25 21:21 */public class Server extends Thread{ ServerUI ui; ServerSocket ss; BufferedReader reader; PrintWriter writer; public Server(ServerUI ui) {this.ui = ui; this.start(); } @Overridepublic void run() {try {ss = new ServerSocket(8081); ui.clients=new ArrayList<>(); println("启动服务器成功:端口8081"); while (true) {println("等待客户端链接......................................."); Socket client = ss.accept(); ui.clients.add(client); println("连接成功,客户端请求服务端的详细信息:" + client.toString()); new ListenerClient(ui, client); }} catch (IOException e) {println("启动服务器失败:端口8081"); 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) {s = "服务端打印消息:" + s; 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 blocke.printStackTrace(); } } }

package socket.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * @author 超 * Create by fengc on2018/7/25 21:33 * 这个类是服务器端的等待客户端发送信息* */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(); } //为每一个客户端创建线程等待接收信息,然后把信息广播出去@Overridepublic 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()); 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"); }}}

package socket.server; import javax.swing.*; import java.awt.*; 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; /** * @author 超 * Create by fengc on2018/7/25 21:21 */public class ServerUI extends JFrame { public static void main(String[] args) {new ServerUI(); } public JButton btStart; //启动服务器public JButton btSend; //发送信息按钮public JTextField tfSend; //需要发送的文本信息 public JTextArea taShow; //信息展示public Server server; //用来监听客户端连接static List 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); } }

客户端代码:
package socket.clinet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * @author 超 * Create by fengc on2018/7/25 21:41 */public class Client extends Thread { ClientUI ui; Socket client; BufferedReader reader; PrintWriter writer; public Client(ClientUI ui) {this.ui = ui; try {String ip = ui.tfIP.getText(); //得到输入的ip地址int port = Integer.parseInt(ui.tfPort.getText()); //得到输入的端口client = new Socket(ip, port); //这里设置连接服务器端的IP的端口println("连接服务器成功,服务器端口地址:" + port); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); writer = new PrintWriter(client.getOutputStream(), true); String name = ui.tfName.getText(); if (name == null || "".equals(name)) {name = "匿名者"; }sendMsg("会员 " + name + ",登录上来了........................"); // 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区} catch (NumberFormatException nu) {println("端口请输入正确......."); nu.printStackTrace(); } catch (IOException e) {println("连接服务器失败:请输入正确的IP地址与端口"); 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"); }} }

package socket.clinet; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * @author 超 * Create by fengc on2018/7/25 21:40 */public class ClientUI extends JFrame { public static void main(String[] args) {new ClientUI(); } publicJButton btStart; publicJButton btSend; publicJTextField tfSend; //装在输入文字publicJTextPanenameText; //输入名字publicJTextPaneipTex; //输入名字publicJTextPaneportText; //输入名字publicJTextField tfName; //服务器ippublicJTextField tfIP; //服务器ippublicJTextField tfPort; //服务器端口publicJTextArea taShow; publicClient server; public ClientUI() {super("客户端"); btStart = new JButton("启动连接"); btSend = new JButton("发送信息"); tfSend = new JTextField(20); tfIP = new JTextField(8); tfPort = new JTextField(3); tfName = new JTextField(6); nameText = new JTextPane(); nameText.setText("登录名"); nameText.setEditable(false); ipTex = new JTextPane(); ipTex.setText("服务地址"); ipTex.setEditable(false); portText = new JTextPane(); portText.setText("服务端口"); portText.setEditable(false); taShow = new JTextArea(); //启动链接按钮事件btStart.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {server = new Client(ClientUI.this); }}); //发送按钮事件btSend.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String name = tfName.getText(); if (name == null || "".equals(name)) {name = "匿名者"; }server.sendMsg(name + ":" + 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); //发送按钮this.add(top, BorderLayout.SOUTH); //加载到底部 //头部放连接服务的JPanel northJpannel = new JPanel(new FlowLayout()); northJpannel.add(nameText); northJpannel.add(tfName); northJpannel.add(ipTex); northJpannel.add(tfIP); northJpannel.add(portText); northJpannel.add(tfPort); northJpannel.add(btStart); this.add(northJpannel,BorderLayout.NORTH); //加载到头部 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(500, 400); this.setLocation(600, 200); this.setVisible(true); } }

【Java实现简单局域网聊天室】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读