java一个学期的成果
2012年01月13日
还有一年就能毕业了,真正毕业。
蛋疼的大学生活
java局域网聊天代码:
服务器端:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.util.*;
import java.io.*;
public class Server extends JFrame {
JMenuBar mb = new JMenuBar();
JMenu m1 = new JMenu("文件");
JMenu m2 = new JMenu("帮助");
JMenuItem mi1 = new JMenuItem("连接");
JMenuItem mi2 = new JMenuItem("退出");
JLabel lab1 = new JLabel("用户在线列表");
JLabel lab2 = new JLabel("消息:");
JTextArea ta = new JTextArea(9, 30);
java.awt.List list = new java.awt.List(9);
JTextField tf = new JTextField(24);
JButton b = new JButton("发送");
JScrollPane sp = new JScrollPane();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
ServerSocket serverSocket;
Socket socket;
ArrayList array = new ArrayList();
int connect;
public Server() {
super("聊天服务器");
setJMenuBar(mb);
mb.add(m1);
mb.add(m2);
m1.add(mi1);
m1.addSeparator();
m1.add(mi2);
sp.getViewport().add(ta);
p1.setLayout(new BorderLayout());
p3.add(lab1);
p1.add(p3, BorderLayout.NORTH);
p1.add(list, BorderLayout.SOUTH);
p2.add(lab2);
p2.add(tf);
p2.add(b);
getContentPane().add(sp, BorderLayout.NORTH);
getContentPane().add(p1, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
pack();
setSize(400, 430);
setVisible(true);
setResizable(false);
//监听服务器连接按钮
mi1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (serverSocket == null) {
try {
serverSocket = new ServerSocket(7000);
ta.append("系统提示:" + " 聊天服务器"
+ " 正在启动......\n");
} catch (IOException ex) {
ta.append("系统提示:" + " 聊天服务器"
+ " 启动失败!\n");
}
} else {
ta.append("系统消息:" + " 聊天服务器"
+ " 已经启动......\n");
}
// 启动监听客户端连接线程
Thread t = new Watch();
t.start();
}
});
mi2.addActionListener(new ServerListener());
//菜单中的退出按钮事件监听
b.addActionListener(new ServerListener());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeAll();
System.exit(0);
}
});
}
class Watch extends Thread {
public void run() {
while (true) {
if (array.size() socket = serverSocket.accept();
} catch (IOException ex) {
ta.append("系统消息: " + ex + "\n");
}
// 创建客户端线程,一个线程对应一个客户端
Client c = new Client(socket);
array.add(c);
c.start();
} else {
ta.append("系统消息:" + " 聊天服务器"
+ " 已经超过最大连接数,请待会连接!\n");
}
}
}
}
class Client extends Thread {
String name;
String ip;
String ipAddress;
Socket socket;
BufferedReader br;
PrintStream ps;
public Client(Socket s) {
try {
socket = s;
br = new BufferedReader(new InputStreamReader(s
.getInputStream()));
ps = new PrintStream(s.getOutputStream());
} catch (IOException ex) {
ta.append("系统消息: " + ex + "\n");
}
}
public void run() {
String info;
try {
while (true) {
info = br.readLine();
if (info == null)
break;
StringTokenizer st = new StringTokenizer(info, ":");
String keyword = st.nextToken();
// 处理客户端传来的信息
if (keyword.equals("CONNECT")) {
name = st.nextToken();
ip = st.nextToken();
ipAddress = ip.substring(ip.indexOf("/") + 1);
ta.append("系统消息: " + name + "/"
+ ipAddress + " 已经连接\n");
list.add(name + " " + ip
+ " 已经登录");
notifyChatRoom();
} else if (keyword.equals("MSG")) {
String broadcast = st.nextToken();
StringBuffer message = new StringBuffer("MSG:"
+ broadcast);
message.append(st.nextToken("\0"));
if (broadcast.equals("BROAD")) {
sendToClients(message);
} else {
sendToClient(message, broadcast);
}
} else if (keyword.equals("QUIT")) {
disConnect(this);
list.removeAll();
for (int i = 0; i 0) {
try {
for (int i = 0; i Socket socket;
PrintStream ps;
String name;
String ip;
public Client() {
super("聊天室");
p1.add(lab3);
p1.add(tf3);
p1.add(lab1);
p1.add(tf1);
p1.add(b1);
p1.add(b2);
p2.add(lab2);
p2.add(tf2);
p2.add(b3);
p3.setLayout(new BorderLayout());
p3.add(list, BorderLayout.NORTH);
p3.add(rb1, BorderLayout.CENTER);
p3.add(rb2, BorderLayout.SOUTH);
bg.add(rb1);
bg.add(rb2);
sp.getViewport().add(ta);
p4.add(p3);
p4.add(sp);
getContentPane().add(p1, BorderLayout.NORTH);
getContentPane().add(p4, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
pack();
setLocation(300,300);
setSize(460, 330);
setVisible(true);
setResizable(false);
b2.setEnabled(false);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
if (tf3.getText().compareTo("")==0 || tf1.getText().compareTo("")==0) {
JOptionPane.showMessageDialog(null,"服务器IP或着用户名不能为空,请输入您所要连接的服务器IP或者您的用户名","错误", JOptionPane.PLAIN_MESSAGE);
} else {
socket = new Socket(tf3.getText(), 7000);
if (socket != null) {
StringBuffer msg = new StringBuffer("CONNECT:");
name = tf1.getText();
ip = tf3.getText();
msg.append(name + ":" + ip);
ps = new PrintStream(socket.getOutputStream());
ps.println(msg);
ps.flush();
ta.setText("");
ta.append(name + "登录成功!" + "\n");
b1.setEnabled(false);
b2.setEnabled(true);
// 启动客户端线程,监听服务器端传来的信息
Thread t = new ClientListener(socket);
t.start();
}
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,"无法找到服务器,请确认服务器IP和服务器是否开启","错误", JOptionPane.PLAIN_MESSAGE);
ta.append("无法找到服务器,登陆失败!");
//ta.append("Error: " + ex + "\n");
}
}
});
b2.addActionListener(new ButtonListener());
b3.addActionListener(new ButtonListener());
//tf2.addActionListener(new TFListener());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if (socket != null) {
ps.println("QUIT:" + name);
ps.flush();
closeSocket();
}
System.exit(0);
}
});
}
class ClientListener extends Thread {
Socket socket;
BufferedReader br;
PrintStream ps;
String message;
public ClientListener(Socket s) {
try {
socket = s;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ps = new PrintStream(socket.getOutputStream());
} catch (IOException ex) {
ta.append("Error: " + ex + "\n");
}
}
public void run() {
while (true) {
try {
message = br.readLine();
if (message == null)
break;
} catch (IOException ex) {
ta.append("Error-debug: " + ex + "\n");
}
StringTokenizer st = new StringTokenizer(message, ":");
String keyword = st.nextToken();
// 服务器端传来各种信息的处理
if (keyword.equals("PEOPLE")) {
list.removeAll();
while (st.hasMoreTokens()) {
String user = st.nextToken();
list.add(user);
}
} else if (keyword.equals("MSG")) {
String broadcast = st.nextToken();
String user = st.nextToken();
StringBuffer sb = new StringBuffer(user
+ st.nextToken("\0"));
ta.append(sb + "\n");
} else if (keyword.equals("QUIT")) {
String who = st.nextToken();
if (who.equals("Server")) {
closeSocket();
ta.append("聊天服务器已经关闭!" + "\n");
list.removeAll();
b2.setEnabled(false);
} else {
closeSocket();
b1.setEnabled(true);
b2.setEnabled(false);
list.removeAll();
ta.append(name + "退出了聊天室!" + "\n");
}
break;
}
}
}
}
public void closeSocket() {
if (socket != null) {
try {
socket.close();
} catch (IOException ex) {
ta.append("Error: " + ex + "\n");
}
}
}
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("退出")) {
ps.println("QUIT:" + name);
ps.flush();
} else if (e.getActionCommand().equals("发送")) {
StringBuffer msg = new StringBuffer("MSG:");
String info = name + ":" + tf2.getText();
if (rb1.isSelected()) {
msg.append("BROAD:" + info);
} else {
msg.append(list.getSelectedItem() + ":" + info);
}
ps.println(msg);
ps.flush();
tf2.setText("");
}
}
}
/* class TFListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
StringBuffer msg = new StringBuffer("MSG:");
String info = name + ":" + tf2.getText();
}
}
*/
public static void main(String[] args) {
Client app = new Client();
}
}
发表评论
-
Windows Phone开发(三)-- 导航原理分析
2012-01-20 01:56 660Windows Phone开发(三)-- 导 ... -
在 Android 平台上应用 Berkeley DB 11gR2 SQL(drop-in模式)(转http://www.cnmsdn.com/html/201004/1270362092ID3134.html)
2012-01-20 01:56 636在 Android 平台上应用 Ber ... -
Android: 你必须掌握的Android命令
2012-01-20 01:56 1025Android: 你必须掌握的Android命令 2011年 ... -
Windows Installer的简单应用
2012-01-20 01:56 677Windows Installer的简单应 ... -
Visual Studio 2010瘦身精简方法
2012-01-20 01:55 927Visual Studio 2010瘦身精简 ... -
AS3.0打造随风吹散效果
2012-01-19 09:42 917AS3.0打造随风吹散效果 2010年07月29日 在这 ... -
一段话一个故事 【微小说】
2012-01-19 09:42 639一段话一个故事 【微小说】 2011年12月17日 生日 ... -
微小说 ≈
2012-01-19 09:42 700微小说 ≈ 2011年1 ... -
校园生活中有哪些搞笑又雷人的小事?
2012-01-19 09:42 588校园生活中有哪些搞笑又雷人的小事? 2012年01月02日 ... -
为期三月
2012-01-19 09:42 689为期三月 2012年01月05日 用一句话开头,一句 ... -
Qt 学习笔记 --Qt SDK 的下载安装与配置
2012-01-17 02:17 656Qt 学习笔记 --Qt SDK 的下 ... -
Android环境搭建(jdk1.6+eclipes3.4.1+Android sdk2.3+adt0.9.7)
2012-01-17 02:17 1165Android环境搭建(jdk1.6+eclipes3.4.1 ... -
Android 3.0 SDK安装教程及系统环境搭建
2012-01-17 02:17 1193Android 3.0 SDK安装教程及系统环境搭建 201 ... -
[书籍资料] MeeGo开发教程汇总{ MeeGo SDK, qemu,Qt,appUp,python }
2012-01-17 02:17 1532[书籍资料] MeeGo开发教程汇总{ MeeGo SDK, ... -
Kinect for Windows SDK可望成微软下一个金矿
2012-01-17 02:17 561Kinect for Windows SDK可望成微软下一个金 ... -
转:开源C++库比较
2012-01-15 21:55 748转:开源C++库比较 2012年01月13日 原文: ... -
linux 客户端 Socket 非阻塞connect编程(转)
2012-01-15 21:54 586linux 客户端 Socket 非阻塞connect编程(转 ... -
Socket编程指南及程序示例(转载)SVN
2012-01-15 21:54 772Socket编程指南及程序示例(转载)SVN 2009年12 ...
相关推荐
此回购协议不仅用于复制和粘贴,还用于学习媒体,如果仅用于复制和粘贴,我的Wallahi对此并不满意:) 学习Java UIN MALIKI Malang的Java模块中的...第一学期=> 作者 穆罕默德·梅加纳塔(Muhammad Meganata)Adam S
这是我学了一学期的Java的小小成果,主要是简单易懂的,如果适合大家的就看看吧
前后端分离开发是目前web开发的主流趋势,通过前后... 本课题使用web与servlet为基石,从Mysql中提取数据,构建一个学生请假管理系统平台。 开发工具:IDEA、Mysql、Navicat等 对于代码的注释非常详细,新手也可以看懂
JAVA 2实用教程第4版 实验代码和实验报告(含代码截图解释课后练习等), 少部分章节没有,本人一学期以来的成果 保证认真完成不保证正确性 仅供参考 转载请注明出处谢谢
一、课程设计目的 通过这次的设计,主要是做出一个小型的管理系统,来加强对JV所学学问的稳固和融会贯穿,可以说是对一个学期所学学问的一个小结,加深对JV数据库的理解。 二、需求分析 功能需求分析: 该系统...
用于展示一学期的学习成果 用于javaweb作业和实验的提交,与考核. 用于展示一学期的学习成果 用于javaweb作业和实验的提交,与考核. 用于展示一学期的学习成果 用于javaweb作业和实验的提交,与考核
本学期伊始我用Java语言写了Android版本的飞花令,第一次写的报告也非常荣幸地成为了模范作业,但几经折腾对Andriod平台有些失望,各种莫名其妙的错误让人很非常头疼,项目也是删了改改了删,于是在做完GPS-Alarm后...
一个月 同组学生姓名: 实习地点: 实习日期: 成 绩: 批改教师: 批改时间: Java Web 实习 ——安博实习报告 前言 昆山安博外包服务产业园区,作为安博教育集团业务的重要组成部分,承担着安博内部 员工、安博...
………………………………………………4 设计体会……………………………………………5 一、设计分析 英汉电子词典作为一个常用的学习工具,系统应该能完成词典的功能。该系统主要用于 实现英汉互译和编辑词典库中的...
团队的一个项目 Fruity Tutti 团队选择了“灯塔”项目来进行整个学期的工作。 该信标旨在成为解决许多公民数字文盲的技术解决方案。 #THE 问题您如何向计算机和互联网技能有限的公民提供新故事,并使他们能够以一种...
现在,小弟现在献上自己学习一个月的成果。 一个DOS界面的支持连续加、减、除、乘的混合计算器。它带两位定点小数及美化界面。完全由最基础的低级汇编编写。 附上小弟59页的对代码的详细注释说明及完整源代码。 希望...
第一个演示文稿是 10 - 12 分钟的进度报告。 进度报告定于 6 月 3 日星期一下午 5:00 至下午 6:50 在 WCC 310 举行。第二次演示是针对演示日,即 6 月 10 日星期一和 6 月 11 日星期二(如果需要)从下午 5:30 - ...
WEBD4201-暗示该存储库包含达勒姆学院Web开发-企业(WEBD 4201... 下一个实验室/可交付成果是:可交付成果3-JSP网页已完成的交付项目包括: 可交付成果#1-Java / OOP评论交付品2-JDBC / Web安全术语测试1-Java / JDBC
压缩包里面有:整个项目系统、数据库、成果书(论文) 学生管理系统: 管理人员所能使用的功能主要有:教师管理、学生管理、课程管理、教室管理、课学期管理等模块。 老师使用主要功能:课程表管理、课表查看等模块...
资源联系讲师电子邮件: 推特: 评估第11周实验室测试20% 第12周的作业提交-30% 年终考试-50%往年实验室测试 第6周-星图ArrayList,类,CSV文件实验室学习成果上课构造函数和访问器方法使用一个ArrayList 发展...
第一个演示文稿是 10 - 12 分钟的进度报告。 进度报告定于 6 月 3 日星期一下午 5:00 至下午 6:50 在 WCC 310 举行。第二次演示是针对演示日,即 6 月 10 日星期一和 6 月 11 日星期二(如果需要)从下午 5:30 - ...
第一个演示文稿是 10 - 12 分钟的进度报告。 进度报告定于 6 月 3 日星期一下午 5:00 至下午 6:50 在 WCC 310 举行。第二次演示是针对演示日,即 6 月 10 日星期一和 6 月 11 日星期二(如果需要)从下午 5:30 - ...
但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角。 C#是一种可视化的、面对对象和事件驱动方式的结构化高级程序设计,可...
您应该基本上涵盖项目的功能子集,并在“测试问题”部分注意如果这是一个专业产品,您还需要添加哪些其他方面以进行全面测试。 测试和代码应位于 GitHub 或其他可公开访问的存储库上。 您可以为此交付物选择合作...
根据功能的不同可以将本系统划分为四个主模块,五个子模块 身份验证:通过登录才可进入选课系统,登录信息提交后检验登录者的身份是否合法,合法,则转入对应的操作界面。在本系统中,只有三种身份:学生、老师、...