`

Socket群聊

    博客分类:
  • java
阅读更多

package TestSocket01;


import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class MyForm extends JFrame{

private static final long serialVersionUID = 1L;
// private JButton jbSent = new JButton("发送");
private JLabel jlabelName = new JLabel("用户昵称:");
private JTextArea jtaName = new JTextArea("");
private JTextArea jtaShow = new JTextArea("");
private JTextArea jtaWrite = new JTextArea("");

public MyForm() {
//测试!
}

public MyForm(String str) {
super(str);
}

public void mShow() {
this.setVisible(true);
}

public void mClose() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void mform() {

this.setLayout(null);
this.setBounds(300, 300, 500, 500);
//this.getContentPane().setBackground(new Color(200, 90, 30)); nothing
this.getContentPane().setBackground(Color.gray);

jlabelName.setBounds(10, 10, 900, 25);
jtaName.setBounds(100, 10, 200, 25);

// jbSent.setBounds(400, 400, 80, 30);
JScrollPane jspShow = new JScrollPane(jtaShow);
JScrollPane jspWrite = new JScrollPane(jtaWrite);

jspShow.setBounds(30, 40, 350, 350);
jtaShow.setLineWrap(true);
jtaShow.setEditable(false);
jtaShow.setCaretPosition(jtaShow.getDocument().getLength());

jspWrite.setBounds(30, 400, 330, 35);
jtaWrite.setLineWrap(true);
jtaWrite.setCaretPosition(jtaWrite.getDocument().getLength());

this.add(jlabelName);
this.add(jtaName);
this.add(jspShow);
this.add(jspWrite);
}

public String getName() {
return jtaName.getText();
}

public void setMessage(String message) {
jtaShow.append(message+"/n"); //添加信息并换行。
//jtaShow.setWrapStyleWord(true);
}

public String getMessage() {
if (!(jtaWrite.getText()).equals("")) { //如果写的东西不为空
if (!(jtaName.getText()).equals("")) { //判断是谁写的信息
return (jtaName.getText() + ": " + jtaWrite.getText());
} else {
return ("ClientX: " + jtaWrite.getText()); //无名氏默认是ClientX
}
} else { //什么都没写
return "";
}
}

public void clearWrite() { //清空所写的东西。
jtaWrite.setText("");
}

public static void main(String[] args) {
MyForm mf = new MyForm(); //测试用的而已。
mf.mform();
mf.mShow();
mf.mClose();

}
}

===========================客户端 socketClient.java===================================

package TestSocket01;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;

public class socketClient implements Runnable {
private Socket s;
private DataInputStream dis;
private DataOutputStream dos;
private boolean flag = true; //标志 如果多个客户端则会出错。

private MyForm mf = new MyForm("通讯客户端"); //新建了一个客户端的界面。
private JButton jbSent = null;

private boolean serverClose = false;// 标识服务器端是否关闭,true为关闭,false为没关闭

public socketClient() {
mf.mform();
mf.mShow();
mf.mClose();

try {
jbSent = new JButton("发送");
jbSent.setBounds(400, 400, 80, 30); //设置按钮的大小
mf.add(jbSent); //添加到JFrame中
s = new Socket("222.17.110.117", 55551); //此处新建了一个Socket,并连接服务器。通信从此位置开始。
jbSent.addActionListener(new ActionListener() { //“发送”按钮监听
public void actionPerformed(ActionEvent e) { //监听按钮的方法。必须实现的。
try {
if(!serverClose){ // 第一次执行时,默认是开着的。之后,如果服务器开着,即没有关闭,则发送下面内容
String message = mf.getMessage(); //取得某人写的某些内容
if (!message.equals("")) {
System.out.println(message); //后台打印测试而已!
dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(message); //把message通过s输出去
mf.clearWrite(); //此处只有发送按钮在监听,故发送之后,内容理应删掉。
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
});
mf.addWindowListener(new WindowAdapter() { // 监听客户端是否关闭,如果关闭,则向服务器发送一个“exit”字符串
public void windowClosing(WindowEvent e) {
try {
if (serverClose) { //serverClose 的值一直都是false。
//此处永远不会被执行。
} else { //因为监听到了窗口被关闭了。
dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF("exit"); //既然关闭了,就发送个信号给服务器。删除该客户端。
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
});

new Thread(this).start(); //打开一个线程,即执行本类的run()函数。
} catch (UnknownHostException e) {
e.printStackTrace();//打印出错信息而已,别无他意。
} catch (IOException e) {
serverClose=true;
mf.setMessage("服务器不存在或未打开!");
}
}

public void run() {
while (flag) {
try {
dis = new DataInputStream(s.getInputStream());
mf.setMessage(dis.readUTF());
} catch (IOException e) {
serverClose = true; //服务器可能在有客户端存在的时候关闭,此时,客户端输入流会出错,刚执行此处
mf.setMessage("服务器关闭了!");
flag=false;//跳出循环
}
}
}

public static void main(String[] agrs) {
new socketClient(); //先开服务器,再开客户端。代码入口处。
}
}

==================================服务器 socketServer.java==============================

package TestSocket01;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
//服务器端
public class socketServer {
private ServerSocket ss;
private Socket s;
private DataInputStream dis;
private DataOutputStream dos;
private static Vector<Client> v = new Vector<Client>();
private Client client;


public socketServer() {
try {
ss = new ServerSocket(55551);
System.out.println("服务器已经启动!"); //后台提示
while (true) {
try {
s = ss.accept(); //一直在等待连接
System.out.println(s);
dis = new DataInputStream(s.getInputStream()); //初始化Socket的两个流。
dos = new DataOutputStream(s.getOutputStream());

System.out.println(v.size()); //打印此时登陆客户端的个数。
client = new Client(v.size(),dos, dis); //说明一个客户端连接上了,给个线程。只能定义一次。。。
v.addElement(client); //往向量里面添加一个客户端。
client.start(); //启动一个线程
System.out.println(getVectorSize());//打印此时登陆客户端的个数。
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
System.out.println("服务器启动失败!");
}
}

public static int getVectorSize() {
return v.size();
}

public static Vector<Client> getVector() {
return v;
}

public static void main(String[] args) {
new socketServer();
}
}
//每个客户端线程连接过去,则建立一个该对象
class Client extends Thread {
int id;
DataOutputStream dos;
DataInputStream dis;

public Client( int id,DataOutputStream dos, DataInputStream dis) {
this.id=id;
this.dis = dis;
this.dos = dos;
}

public void run() { //启动时便执行该段代码!
boolean flag = true; //只是一个标志
int m;
while (flag) {
try {
String message = dis.readUTF(); //输入进来的流,简称输入流,拿到客户端的信息。
System.out.println(message); //后台打印出来
if (message.equals("exit")) {//如果接收到"exit"字符串,说明运行该线程的客户端断开了连接,则需退出该循环,退出线程
flag = false; //退出循环
socketServer.getVector().remove(this); //当客户端关闭时,从Vector里除去本对象
} else {
m = socketServer.getVectorSize(); //返回共有多少个客户端目前。
for (int i = 0; i < m; i++) { //给每个客户端发送同样的信息。
socketServer.getVector().get(i).dos.writeUTF(message); //输出信息给每个客户端。
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

分享到:
评论

相关推荐

    socket群聊实例

    在这个“socket群聊实例”中,我们将探讨如何使用Java的Socket和ServerSocket类构建一个简单的多人聊天系统。 首先,服务器端的实现至关重要。`ServerSocket`类在Java中用于监听客户端的连接请求。你需要创建一个`...

    socket群聊

    "Socket群聊"项目就是利用Socket来构建一个可以支持多用户同时在线聊天的应用。在这个项目中,观察者模式(Observer Pattern)被巧妙地融入,以处理用户间的实时消息传递和状态更新。 首先,我们需要理解Socket的...

    socket编程(实现群聊功能+界面清晰)

    本项目以"socket编程(实现群聊功能+界面清晰)"为主题,旨在创建一个支持多客户端实时交流的群聊系统,同时提供了图形用户界面(GUI)以提高用户体验。以下是关于这个项目的一些关键知识点和实现细节: 1. **...

    socket,多线程实现群聊

    本文将深入探讨如何利用多线程和Socket技术来实现一个简单的群聊应用。这个应用包括两个主要部分:服务端(Server)和客户端(Client)。 首先,我们要理解Socket的概念。Socket是网络上的进程间通信(IPC)的一种...

    Socket 群聊

    完成群发聊天功能, 普通的Javaweb项目,哈哈,字数还不够

    C# Socket群聊

    研究了一个多星期socket 写了个局域网群聊的小程序,, 分服务端,,,客户端(可多开),,,代码比较乱,但有注释, 给大家看看有什么不足的地方 告诉小弟我,,qq623932737 email:623932737@qq.com

    Socket网络编程实例

    7. **聊天室逻辑**:聊天系统可能包含用户注册、登录、群聊、私聊等功能。这些功能的实现需要额外的数据结构(如队列或数据库)来存储和检索消息,以及控制用户权限。 8. **安全性**:考虑使用SSL/TLS加密通信,以...

    socket单聊 群聊 发送文件

    本项目标题为"socket单聊 群聊 发送文件",这意味着它利用Java的Socket库构建了一个具备基本聊天功能的应用,包括一对一的单聊、多用户参与的群聊以及文件传输。下面将详细介绍这些知识点: 1. **Java Socket**: ...

    socket实现群聊效果

    该demo实现了客户端与服务器端的通信,实现了类似于群聊的效果。no demo no true!!

    express_socket_demo 群聊功能

    `express_socket_demo`是一个基于Express和Socket.IO的示例项目,它演示了如何在Web应用中实现群聊功能。Express是Node.js中广泛使用的Web框架,而Socket.IO则是一个强大的库,用于实现实时双向通信。下面我们将详细...

    java 利用scoket实现多个客户端之间的群聊

    通过以上步骤,我们可以构建一个基本的Java Socket群聊系统。每个客户端都可以独立地发送和接收消息,而服务器作为中介,确保了消息的正确传递。当然,为了提升用户体验,还可以添加更多的功能,如用户名注册、在线...

    Socket局域网群聊.zip

    Socket局域网群聊是一个基于C#编程语言和WPF(Windows Presentation Foundation)技术实现的多客户端通信系统,它利用了Socket技术构建了一个简单的聊天服务器,使得多个客户端可以在同一个局域网内进行实时的消息...

    Win32项目 C++利用socket实现C/S客户端间群聊和私聊

    在本文中,我们将深入探讨如何在Win32平台上利用C++和Socket技术构建一个C/S架构的聊天应用程序,实现客户端间的群聊和私聊功能。首先,我们需要了解几个关键概念和关键技术。 1. **Win32 API**:Windows操作系统...

    socket+swing局域网群聊系统

    在这个“socket+swing局域网群聊系统”项目中,我们看到这两个技术的结合,为初学者提供了一个很好的实践平台。 首先,让我们详细了解一下Socket编程。Socket是网络编程的基础,它提供了应用程序之间通信的端点。在...

    javaSocket带界面聊天室

    Java Socket 是一种在Java编程语言中实现网络通信的基础工具,常用于构建客户端-服务器应用程序。在这个"javaSocket带界面聊天室"项目中,开发者利用Java的Socket类和Swing库创建了一个具有图形用户界面(GUI)的...

    java,socket聊天,单聊,群聊,传文件,加密聊天和传文件

    Java Socket聊天程序是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过互联网进行双向通信。在这个项目中,我们看到的是一个使用Java Swing库构建的图形用户界面(GUI)应用,它集成了多种功能,如单聊、...

    socket编程实现简单私聊群聊源码

    在本示例中,"socket编程实现简单私聊群聊源码" 涉及到的是如何使用Socket来构建一个基本的聊天应用程序,包括一对一的私聊和多用户参与的群聊功能。 首先,Socket是操作系统提供的接口,它允许应用程序通过网络...

    c# socket编程 一个简单的模拟QQ聊天软件 可以群聊

    本项目“C# Socket编程:一个简单的模拟QQ聊天软件”就是一个很好的示例,它展示了如何利用Socket实现多人在线聊天功能,类似于QQ的群聊。 首先,让我们深入了解Socket。Socket是网络通信的基础,它为应用程序提供...

    群聊功能 网络编程 套接字 socket qq 多线程

    多线程 群聊功能 网络编程 套接字 socket 实现群聊功能

Global site tag (gtag.js) - Google Analytics