天空下的雨
用乐观的生活,品味非凡人生。 博客搬家了,欢迎进入新博客:www.sh96.cn
订阅博客
首 页
关于
照片
服务
作品
归档
留言板
01
Aug
2008
我要评论
【转】用java写的基于Socket的简单即时通讯程序
作者:
天空下的雨
用java写的基于Socket的简单即时通讯程序,用户可以注册并登录,也可以作为游客身份使用.
Java代码
/**/
/*
*服务端
*/
import
java.io.*;
import
java.net.*;
import
java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
import
java.awt.event.KeyAdapter;
import
java.awt.event.KeyEvent;
import
javax.swing.*;
public
class
Server
extends
JFrame
implements
Runnable {
private
ServerSocket server;
private
Socket connection;
private
OutputStream output;
private
InputStream input;
private
Thread outThread;
private
JTextArea display;
private
JTextField text1;
private
JButton startButton;
public
static
void
main(String args[]) {
Server s =
new
Server();
s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public
Server() {
super
(
"Server"
);
startButton =
new
JButton(
"Start the server"
);
text1 =
new
JTextField(
20
);
display =
new
JTextArea(
7
,
30
);
display.setEditable(
false
);
Container container = getContentPane();
container.setLayout(
new
BorderLayout());
container.add(startButton,BorderLayout.NORTH);
container.add(
new
JScrollPane(display),BorderLayout.CENTER);
container.add(text1,BorderLayout.SOUTH);
/**/
/*
* 给开始按钮添加监听器。
*/
startButton.addActionListener(
new
ActionListener(){
public
void
actionPerformed(ActionEvent e) {
display.setText(
"启动服务器 "
);
startButton.setEnabled(
false
);
try
{
//端口设为5000,最大连接请求为100个
server =
new
ServerSocket(
5000
,
100
);
connection = server.accept();
output = connection.getOutputStream();
input = connection.getInputStream();
output.write(
"连接成功! "
.getBytes());
outThread =
new
Thread(Server.
this
);
outThread.start();
}
catch
(IOException ee) {
}
}
});
/**/
/*
/*给文本域添加键盘监听器,按回车发送信息。
*/
text1.addKeyListener(
new
KeyAdapter(){
public
void
keyPressed(KeyEvent ke) {
if
(ke.getKeyCode() == KeyEvent.VK_ENTER){
byte
writeBytes[] =
new
byte
[
50
];
String s =
"Server: "
+ text1.getText() +
""
;
text1.setText(
""
);
writeBytes = s.getBytes();
display.append(s+
" "
);
try
{
output.write(writeBytes);
}
catch
(IOException ee) {
}
if
(s.trim().equals(
"Server: exit"
)) {
outThread.stop();
quit();
}
}
}
});
setSize(
300
,
400
);
setResizable(
false
);
setVisible(
true
);
}
public
void
run() {
while
(
true
) {
byte
readBytes[] =
new
byte
[
50
];
try
{
input.read(readBytes);
//读去对方发送的消息
}
catch
(IOException e) {
}
String s =
new
String(readBytes);
display.append(s+
" "
);
if
(s.trim().equals(
"Client: exit"
))
break
;
}
quit();
}
public
void
quit() {
try
{
output.close();
input.close();
connection.close();
}
catch
(IOException e) {
}
startButton.setEnabled(
true
);
}
}
/**/
/*
*客户端
*/
package
edu.jlu.fuliang;
import
java.io.*;
import
java.net.*;
import
java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
import
java.awt.event.KeyAdapter;
import
java.awt.event.KeyEvent;
import
javax.swing.*;
public
class
Client
extends
JFrame
implements
Runnable {
private
Socket client;
private
OutputStream output;
private
InputStream input;
private
Thread outThread;
private
JTextArea display;
private
JTextField text1;
private
JButton startButton;
private
JMenu loginMenu =
new
JMenu(
"登录"
);
private
JMenuItem register =
new
JMenuItem(
"注册"
);
private
JMenuItem login =
new
JMenuItem(
"登录"
);
private
JMenuBar bar =
new
JMenuBar();
private
Register registerDlg ;
private
Login loginDlg;
private
RandomAccessFile file;
public
static
void
main(String args[]) {
Client c =
new
Client();
c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public
Client() {
super
(
"Client"
);
startButton =
new
JButton(
"Connect to server"
);
text1 =
new
JTextField(
20
);
display =
new
JTextArea(
7
,
30
);
display.setEditable(
false
);
loginMenu.add(register);
loginMenu.add(login);
bar.add(loginMenu);
setJMenuBar(bar);
Container container = getContentPane();
container.setLayout(
new
BorderLayout());
container.add(startButton,BorderLayout.NORTH);
container.add(
new
JScrollPane(display),BorderLayout.CENTER);
container.add(text1,BorderLayout.SOUTH);
try
{
file =
new
RandomAccessFile(
new
File(
"E://login.txt"
),
"rw"
);
}
catch
(IOException e1) {
e1.printStackTrace();
}
registerDlg =
new
Register(
this
,file);
loginDlg =
new
Login(
this
,file);
startButton.addActionListener(
new
ActionListener(){
public
void
actionPerformed(ActionEvent e) {
display.setText(
"连接服务器"
);
startButton.setEnabled(
false
);
try
{
client =
new
Socket(
"127.0.0.1"
,
5000
);
output = client.getOutputStream();
input = client.getInputStream();
outThread =
new
Thread(Client.
this
);
outThread.start();
}
catch
(IOException ee) {
}
}
});
text1.addKeyListener(
new
KeyAdapter(){
public
void
keyPressed(KeyEvent ke) {
if
(ke.getKeyCode() == KeyEvent.VK_ENTER){
byte
writeBytes[] =
new
byte
[
50
];
String s = loginDlg.getLoginName()+
": "
+ text1.getText() +
""
;
text1.setText(
""
);
writeBytes = s.getBytes();
display.append(s+
" "
);
try
{
output.write(writeBytes);
}
catch
(IOException ee) {
}
if
(s.trim().equals(loginDlg.getLoginName()+
": exit"
)) {
outThread.stop();
quit();
}
}
}
});
register.addActionListener(
new
ActionListener(){
public
void
actionPerformed(ActionEvent e) {
registerDlg.setVisible(
true
);
}
});
login.addActionListener(
new
ActionListener(){
public
void
actionPerformed(ActionEvent e) {
loginDlg.setVisible(
true
);
}
});
setSize(
300
,
400
);
setResizable(
false
);
setVisible(
true
);
}
public
void
run() {
while
(
true
) {
byte
readBytes[] =
new
byte
[
1024
];
try
{
input.read(readBytes);
}
catch
(IOException e) {
}
String s =
new
String(readBytes);
display.append(s+
" "
);
if
(s.trim().equals(
"Server: exit"
))
break
;
}
quit();
}
public
void
quit() {
try
{
output.close();
input.close();
client.close();
}
catch
(IOException e) {
}
startButton.setEnabled(
true
);
}
}
package
edu.jlu.fuliang;
import
java.awt.*;
import
java.awt.event.*;
import
java.io.*;
import
javax.swing.*;
public
class
Login
extends
JDialog{
private
JTextField textField;
private
JButton loginButton;
private
RandomAccessFile file;
//保存注册信息的文件
private
String loginName =
"guest"
;
//保存登录者的名字,为登陆为guest;
public
Login(JFrame f,RandomAccessFile file){
super
(f,
"登陆"
,
false
);
this
.file = file;
JPanel panel =
new
JPanel();
panel.add(
new
JLabel(
"昵称:"
));
textField =
new
JTextField(
10
);
panel.add(textField);
Container container = getContentPane();
container.setLayout(
new
BorderLayout());
container.add(panel,BorderLayout.NORTH);
loginButton =
new
JButton(
"登陆"
);
container.add(loginButton,BorderLayout.SOUTH);
setVisible(
false
);
setBounds(
100
,
200
,
200
,
200
);
loginButton.addActionListener(
new
LoginListener());
}
public
String getLoginName(){
return
loginName;
}
/**/
/*
* 登录监听器,当单击登陆按钮时,触发该事件
* 从文件中读取并查找是否注册过,如果没有找
* 到则弹出未注册警告。否则弹出欢迎对话框表
* 示欢迎
*/
private
class
LoginListener
implements
ActionListener{
public
void
actionPerformed(ActionEvent e) {
boolean
flag =
false
;
try
{
String name = textField.getText().trim();
textField.setText(
""
);
file.seek(
0
);
while
(file.getFilePointer() < file.length()){
String nik = file.readUTF();
if
(nik.equals(name)){
flag =
true
;
loginName = name;
break
;
}
}
if
(!flag){
String warning=
"没有找到你的账号请先注册!"
;
JOptionPane.showMessageDialog(Login.
this
,warning,
"警告"
,JOptionPane.WARNING_MESSAGE);
}
else
{
String welcome=
"欢迎来聊天!"
;
JOptionPane.showMessageDialog(Login.
this
,welcome,
"欢迎"
,JOptionPane.WARNING_MESSAGE);
}
Login.
this
.setVisible(
false
);
}
catch
(IOException e1) {
e1.printStackTrace();
}
}
}
}
import
java.awt.*;
import
java.awt.event.*;
import
java.io.*;
import
javax.swing.*;
public
class
Register
extends
JDialog{
private
String nickName;
private
JTextField textField;
private
JButton registerButton;
private
RandomAccessFile file;
////保存注册信息的文件
public
Register(JFrame f,RandomAccessFile file){
super
(f,
"注册"
,
false
);
this
.file = file;
JPanel panel =
new
JPanel();
panel.add(
new
JLabel(
"昵称:"
));
textField =
new
JTextField(
10
);
panel.add(textField);
Container container = getContentPane();
container.setLayout(
new
BorderLayout());
container.add(panel,BorderLayout.NORTH);
registerButton =
new
JButton(
"注册"
);
container.add(registerButton,BorderLayout.SOUTH);
setVisible(
false
);
setBounds(
100
,
200
,
200
,
200
);
registerButton.addActionListener(
new
RegisterListener());
}
/**/
/*
* 注册监听器,当单击登注册按钮时,触发该事件
* 并向文件中写入注册信息。
*/
private
class
RegisterListener
implements
ActionListener{
public
void
actionPerformed(ActionEvent e) {
try
{
file.seek(file.length());
String str = textField.getText();
textField.setText(
""
);
file.writeUTF(str);
Register.
this
.setVisible(
false
);
}
catch
(IOException e1) {
e1.printStackTrace();
}
}
}
推荐(0)
(
收藏
)
分享至:
<<
上一篇
下一篇
>>
标签:
Java
| 分类:
编程·设计
|
RSS 2.0
|
Trackback
相关日志
在JSP中用bean简单封装数据库操作
SSH框架模式中的实用分页Java(Struts + Spring + Hibernate)
Java开发者需坚守的十大基本准则【转自IT168】
今天解决了困扰很久的JAVA数据库乱码问题
checkbox在JSP实现批量删除的过程中的取值问题
一段args反转的字符串JAVA代码
【转】教你如何成为一名Java初级程序员
Java最简单的经典实例:Helloworld
打印10万个hello,world,Java比C++快25倍
java中jdk环境变量的设置(Windows系统)
发表评论:
昵称
邮箱 (不会被公布)(必填)
网站
或
取消回复
欢迎光临
欢迎访问我的新独立博客,
http://www.sh96.cn
QQ:6353338
Email:admin&68080.com
分类
业界·观察
(40)
学习·教程
(10)
心情·生活
(144)
文摘·收藏
(70)
每日·故事
(70)
编程·设计
(15)
网页·技术
(24)
记录·开发
(3)
资源·共享
(34)
最新日志
博客搬家了,欢迎进入新博客:www.sh96.cn
晚上回来,闲着没事整理QQ
情侣博客——记录生活的点点滴滴!开发展示
从正义道德、商业竞争的角度,我支持腾讯!
68080上网导航v1.2 简洁、高速、实用全新开发
DIV在100%下iframe宽度高度的自适应的问题
kakabox音乐管理系统v2.0,正在全新开发中
偷听儿子接女生电话的妈妈,是否应该?
每日故事——与精神病人一起做蘑菇
360欺骗用户、竞争不厚道,鄙视之!
八月十五中秋佳节,细雨蒙蒙。
听着一首美妙的纯音乐《天际》,心情平静了许多
标签
业界
业界 备案
作品
共享
分享
博客
原创
员工
国家
图片
头像
孩子
巨雷
开发
手机
技巧
技术
接口
支付
收藏
故事
教育
文摘
新闻
日记
歌
汝城
演讲
生活
电影
留言
程序
笑话
网站
网页
观察
谷歌
软件
长沙
CSS
Gravatar
IT
Java
php
WPS
订阅站点
博客空间
Copterfly's blog
乞丐的幸福生活
亮亮的博客—专注web
同城博客秀
弦歌有你
爱上喝牛奶
英语学习方法网
郭险峰博客
雁城孤客-灵魂的栖息地
马车夫的博客
好文章
天天文章网
资源
Jquery nyromodal
不错的Ext-Js技术网站
极卡建站资源