- 浏览: 218829 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
zzhyq:
有没有后台是ASHX 的呀
Ext.tree.TreePanel -
693593336:
谢谢作者分享,正好用上
Ext.tree.TreePanel -
greatwqs:
提供一个下载的demo不是更好
基于servlet的 Freemarker Demo
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();
}
}
}
}
发表评论
-
Singletons and lazy loading
2011-09-26 19:47 914The Java Memory Model # ... -
JVM blogs
2011-09-14 21:40 470话说是 【JVM详解的专题】,很多文章的差不多的,有的详 ... -
effective Java _Generic
2011-09-12 12:03 0#23 -
Class Loader
2011-08-28 16:47 774专栏合集(一):Java深度历险 pdf已上传1 ... -
Study Linkinginginginginginginging
2011-08-27 10:42 730#1 java 工程和类等路径汇总 #2 让Apac ... -
How to send Email
2011-08-26 15:32 6021.java mail 使用介绍 2.Java ... -
Java_Try_Finally
2011-07-18 11:51 643public class TestTryCatch { ... -
Java Class ClassLoader
2011-07-15 17:05 1027下午在看《Java 深度历险》,对Class & ... -
关键字 final & transient
2011-06-08 16:49 965final 详见: http://java.chinaitl ... -
课程设计3
2010-01-04 14:09 779题目3:动态分区式存储管理的存储分配和回收 一、设计目的 ... -
课程设计1
2010-01-04 14:24 748采用的是C++语言编写的,但PCB的数据结构是符合要求的。 ... -
os课程设计后感
2010-01-04 14:48 541今天终于把操作系统的实验给终结了。基本要求算是符合了,可能表 ... -
java作业01
2010-03-06 16:02 663package homework01; public cla ... -
Java作业02
2010-03-11 14:22 789package homework02; import jav ... -
File函数返回当前路径
2010-03-12 19:37 671package netWorkMoreThreadCopy; ... -
多线程文件复制(界面)1
2010-03-12 23:45 940package netWorkMoreThreadCopy; ... -
Java IO 转摘
2010-03-15 00:26 510java中的io中的(input/output)str ... -
java作业03
2010-03-17 00:59 696package homework03; import jav ... -
Java作业
2010-03-17 01:19 640package homework03;import java. ... -
java作業3
2010-03-18 18:36 592package homework03;/** 首先编写一个抽象 ...
相关推荐
在这个“socket群聊实例”中,我们将探讨如何使用Java的Socket和ServerSocket类构建一个简单的多人聊天系统。 首先,服务器端的实现至关重要。`ServerSocket`类在Java中用于监听客户端的连接请求。你需要创建一个`...
"Socket群聊"项目就是利用Socket来构建一个可以支持多用户同时在线聊天的应用。在这个项目中,观察者模式(Observer Pattern)被巧妙地融入,以处理用户间的实时消息传递和状态更新。 首先,我们需要理解Socket的...
本项目以"socket编程(实现群聊功能+界面清晰)"为主题,旨在创建一个支持多客户端实时交流的群聊系统,同时提供了图形用户界面(GUI)以提高用户体验。以下是关于这个项目的一些关键知识点和实现细节: 1. **...
本文将深入探讨如何利用多线程和Socket技术来实现一个简单的群聊应用。这个应用包括两个主要部分:服务端(Server)和客户端(Client)。 首先,我们要理解Socket的概念。Socket是网络上的进程间通信(IPC)的一种...
完成群发聊天功能, 普通的Javaweb项目,哈哈,字数还不够
研究了一个多星期socket 写了个局域网群聊的小程序,, 分服务端,,,客户端(可多开),,,代码比较乱,但有注释, 给大家看看有什么不足的地方 告诉小弟我,,qq623932737 email:623932737@qq.com
7. **聊天室逻辑**:聊天系统可能包含用户注册、登录、群聊、私聊等功能。这些功能的实现需要额外的数据结构(如队列或数据库)来存储和检索消息,以及控制用户权限。 8. **安全性**:考虑使用SSL/TLS加密通信,以...
本项目标题为"socket单聊 群聊 发送文件",这意味着它利用Java的Socket库构建了一个具备基本聊天功能的应用,包括一对一的单聊、多用户参与的群聊以及文件传输。下面将详细介绍这些知识点: 1. **Java Socket**: ...
该demo实现了客户端与服务器端的通信,实现了类似于群聊的效果。no demo no true!!
`express_socket_demo`是一个基于Express和Socket.IO的示例项目,它演示了如何在Web应用中实现群聊功能。Express是Node.js中广泛使用的Web框架,而Socket.IO则是一个强大的库,用于实现实时双向通信。下面我们将详细...
通过以上步骤,我们可以构建一个基本的Java Socket群聊系统。每个客户端都可以独立地发送和接收消息,而服务器作为中介,确保了消息的正确传递。当然,为了提升用户体验,还可以添加更多的功能,如用户名注册、在线...
Socket局域网群聊是一个基于C#编程语言和WPF(Windows Presentation Foundation)技术实现的多客户端通信系统,它利用了Socket技术构建了一个简单的聊天服务器,使得多个客户端可以在同一个局域网内进行实时的消息...
在本文中,我们将深入探讨如何在Win32平台上利用C++和Socket技术构建一个C/S架构的聊天应用程序,实现客户端间的群聊和私聊功能。首先,我们需要了解几个关键概念和关键技术。 1. **Win32 API**:Windows操作系统...
在这个“socket+swing局域网群聊系统”项目中,我们看到这两个技术的结合,为初学者提供了一个很好的实践平台。 首先,让我们详细了解一下Socket编程。Socket是网络编程的基础,它提供了应用程序之间通信的端点。在...
Java Socket 是一种在Java编程语言中实现网络通信的基础工具,常用于构建客户端-服务器应用程序。在这个"javaSocket带界面聊天室"项目中,开发者利用Java的Socket类和Swing库创建了一个具有图形用户界面(GUI)的...
Java Socket聊天程序是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过互联网进行双向通信。在这个项目中,我们看到的是一个使用Java Swing库构建的图形用户界面(GUI)应用,它集成了多种功能,如单聊、...
在本示例中,"socket编程实现简单私聊群聊源码" 涉及到的是如何使用Socket来构建一个基本的聊天应用程序,包括一对一的私聊和多用户参与的群聊功能。 首先,Socket是操作系统提供的接口,它允许应用程序通过网络...
本项目“C# Socket编程:一个简单的模拟QQ聊天软件”就是一个很好的示例,它展示了如何利用Socket实现多人在线聊天功能,类似于QQ的群聊。 首先,让我们深入了解Socket。Socket是网络通信的基础,它为应用程序提供...
多线程 群聊功能 网络编程 套接字 socket 实现群聊功能