Java实现简单局域网聊天室

网友投稿 228 2022-10-16


Java实现简单局域网聊天室

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

Java 的Socket编程:

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

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

客户端的Socket类

服务器端的ServerSocket类

3、Socket通信的步骤

① 创建ServerSocket和Socket

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

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

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

4、服务器端:

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

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

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

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

⑤ 关闭相关资源

5、客户端:

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

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

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

④ 关闭响应资源

实现的聊天室例子:

实现的效果是如下:

服务端代码:

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 on 2018/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();

}

@Override

public 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 block

e.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 on 2018/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();

}

//为每一个客户端创建线程等待接收信息,然后把信息广播出去

@Override

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());

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 on 2018/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 on 2018/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.WindowAhttp://dapter;

import java.awt.event.WindowEvent;

/**

* @author 超

* Create by fengc on 2018/7/25 21:40

*/

public class ClientUI extends JFrame {

public static void main(String[] args) {

new ClientUI();

}

public JButton btStart;

public JButton btSend;

public JTextField tfSend; //装在输入文字

public JTextPane nameText; //输入名字

public JTextPane ipTex; //输入名字

public JTextPane portText; //输入名字

public JTextField tfName; //服务器ip

public JTextField tfIP; //服务器ip

public JTextField tfPort; //服务器端口

public JTextArea taShow;

public Client 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);

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:进阶-STP生成树协议
下一篇:# 运维小白的成长日记第七天-OSI七层传输层/应用层精讲!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~