群聊
来源:互联网 发布:程序员 霸气 口号 编辑:程序博客网 时间:2024/04/29 07:12
//服务器端。Server.java
package cc.nothing2012.blogServlet;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import javax.swing.DefaultListModel;
public class Server {
private ServerSocket serverSocket;
private Socket socket;
private static Vector<ServerObject> vector = new Vector<ServerObject>();
private static Vector<String> vectorIP=new Vector<String>();
private ServerObject serverObject;
public Server() {
try {
serverSocket = new ServerSocket(55555);
System.out.println("服务器已经启动!"); // 后台提示
while (true) {
try {
socket = serverSocket.accept(); // 一直在等待连接
p(socket);
final InetAddress address = socket.getInetAddress();
p("那个丫的连接的IP:" + address);
p(vector.size()); // 打印连接前,登陆客户端的个数。
serverObject = new ServerObject(vector.size(), socket); // 说明一个客户端连接上了, 新建对象线程。
vector.addElement(serverObject); // 往向量里面添加一个客户端。
vectorIP.addElement(address.getHostAddress()); //把ip存起来。
//Form.jList.removeAll();
p("there");
new Timer().schedule(new TimerTask(){
public void run(){
// Form.jList.setListData(vectorIP);
DefaultListModel model2=new DefaultListModel();
Form.jList.setModel(model2);
model2.removeAllElements();
model2.addElement(address.getHostAddress());
p("here");
}
}, 2000,3000);
serverObject.start(); // 启动一个线程
p(vector.size()); // 打印连接后,登陆客户端的个数。
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
p("服务器启动失败!");
}
}
public void p(Object o) {
System.out.println(o);
}
public static void main(String[] args) {
new Server();
}
class ServerObject extends Thread {
private DataOutputStream out = null;
private DataInputStream in = null;
private Socket socket=null;
private int id;
// 每个连接过来的客户端,将初始化这样的一个对象。
public ServerObject(int id, Socket socket) {
this.socket=socket;
this.id = id;
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
// 启动线程时,执行
public void run() {
boolean flag = true; // 只是一个标志
int m;
while (flag) {
try {
String message = in.readUTF(); // 输入进来的流,简称输入流,拿到客户端的信息。
System.out.println(message); // 后台打印出来
if (message.equals("exit")) {// 如果接收到"exit"字符串说明运行该线程的客户端断开了连接
// ,则需退出该循环,退出线程
flag = false; // 退出循环
Server.vector.remove(this); // 当客户端关闭时,从Vector里除去本对象
} else {
m = Server.vector.size(); // 返回共有多少个客户端目前。
for (int i = 0; i < m; i++) { // 给每个客户端发送同样的信息。
Server.vector.get(i).out.writeUTF(message); // 输出信息给每个客户端。
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
//客户端 Client.java
package cc.nothing2012.blogServlet;
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 Client implements Runnable {
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private boolean flag = true; // 标志 如果多个客户端则会出错。
private Form mf = new Form("通讯客户端"); // 新建了一个客户端的界面。
private JButton jbSent = null;
private boolean serverClose = false;// 标识服务器端是否关闭,true为关闭,false为没关闭
public Client() {
mf.mform();
mf.mShow();
mf.mClose();
try {
jbSent = new JButton("发送");
jbSent.setBounds(400, 400, 80, 30); // 设置按钮的大小
mf.add(jbSent); // 添加到JFrame中
socket = new Socket("222.17.110.117", 55555); // 此处新建了一个Socket,并连接服务器。通信从此位置开始。
jbSent.addActionListener(new ActionListener() { // “发送”按钮监听
public void actionPerformed(ActionEvent e) { // 监听按钮的方法。必须实现的 。
try {
if (!serverClose) { // 第一次执行时,默认是开着的。之后,如果服务器开着,即没有关闭,则发送下面内容
String message = mf.getMessage(); // 取得某人写的某些内容
if (!message.equals("")) {
out = new DataOutputStream(socket.getOutputStream());
out.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 { // 因为监听到了窗口被关闭了。
out = new DataOutputStream(socket.getOutputStream());
out.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 {
in = new DataInputStream(socket.getInputStream());
mf.setMessage(in.readUTF());
} catch (IOException e) {
serverClose = true; // 服务器可能在有客户端存在的时候关闭,此时,客户端输入流会出错,刚执行此处
mf.setMessage("服务器关闭了!");
flag = false;// 跳出循环
}
}
}
public static void main(String[] agrs) {
new Client(); // 先开服务器,再开客户端。代码入口处。
}
}
//客户端界面 Form.java
package cc.nothing2012.blogServlet;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Form extends JFrame {
private static final long serialVersionUID = 1L;
private JLabel jlabelName = new JLabel("用户昵称:");
private JTextArea jtaName = new JTextArea("");
private JTextArea jtaShow = new JTextArea("");
private JTextArea jtaWrite = new JTextArea("");
public static JList jList=new JList();
JScrollPane jScrollPane1 = new JScrollPane();
public Form() {
// 测试!
}
public Form(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, 550, 550);
this.getContentPane().setBackground(Color.lightGray);
jlabelName.setBounds(10, 10, 900, 25);
jtaName.setBounds(100, 10, 200, 25);
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());
JLabel jlOn=new JLabel("目前在线人的IP:");
jlOn.setBounds(400, 10, 200, 25);
// 坐标 xy width,height
jList.setBounds(385, 40, 150, 350);
//jList.setModel(new DefaultListModel());
this.add(jlabelName);
this.add(jtaName);
this.add(jlOn); //
this.add(jspShow);
this.add(jList);
this.add(jspWrite);
}
public String getName() {
return jtaName.getText();
}
public void setMessage(String message) {
jtaShow.append(message + "/n"); // 添加信息并换行。
}
public String getMessage() {
if (!(jtaWrite.getText()).equals("")) { // 如果写的东西不为空
if (!(jtaName.getText()).equals("")) { // 判断是谁写的信息
return (jtaName.getText() + ": " + jtaWrite.getText());
} else {
return ("默认是骚包: " + jtaWrite.getText()); // 无名氏默认是ClientX
}
} else { // 什么都没写
return "";
}
}
public void clearWrite() { // 清空所写的东西。
jtaWrite.setText("");
}
public static void main(String[] args) {
Form mf = new Form(); // 测试用的而已。
mf.mform();
mf.mShow();
mf.mClose();
}
}
- 群聊
- 群聊
- Socket群聊
- Socket群聊
- socket群聊
- Java 群聊
- 模拟qq群聊
- 使用asyncsocket群聊
- ios xmpp+openfire 群聊
- socketio单聊,群聊
- ios xmpp+openfire 群聊
- udp通讯_群聊
- Java TCP 群聊
- 聊天编程(群聊、私聊)
- 网络通信聊天程序(群聊)
- XMPP学习6-群聊(MUC)
- 173. Spring Boot WebSocket:群聊
- 群聊,聊到天昏地暗 – Android 聊天室
- 一个简单的FileUpLoad控件的实现。
- 程序3
- (转)一些rtsp实现的开源代码
- java.lang.UnsupportedClassVersionError: Bad version number in .class file异常的
- ds通用stack(1.1)
- 群聊
- 用例的概念理解
- 最近比较烦(程序员版)转载(版权所有:gtth 原作 )
- 自己给自己中了很多木马,呵呵。
- 网站关键词布局研究
- System.Net.HttpListener类(异步方式处理请求)
- 查看当前程序进程及操作系统所有进程
- SQL Server面试题目
- 创建和销毁子进程