1. 谁的是基于java的聊天软件开发
android 系统的所有APP 基本都是基于JAVA开发的,IOS 系统的APP是基于Objective-C。都是面向对象的编程语言。
2. 怎么样用JAVA做个聊天软件
/**
* 基于UDP协议的聊天程序
*
* 2007.9.18
* */
//导入包
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.net.*;
public class Chat extends JFrame implements ActionListener
{
//广播地址或者对方的地址
public static final String sendIP = "127.0.0.1";
//发送端口9527
public static final int sendPort = 8000;
JPanel p = new JPanel();
List lst = new List(); //消息显示
JTextField txtIP = new JTextField(18); //填写IP地址
JTextField txtMSG = new JTextField(20); //填写发送消息
JLabel lblIP = new JLabel("IP地址:");
JLabel lblMSG = new JLabel("消息:");
JButton btnSend = new JButton("发送");
byte [] buf;
//定义DatagramSocket的对象必须进行异常处理
//发送和接收数据报包的套接字
DatagramSocket ds = null;
//=============构造函数=====================
public Chat()
{
CreateInterFace();
//注册消息框监听器
txtMSG.addActionListener(this);
btnSend.addActionListener(this);
try
{
//端口:9527
ds =new DatagramSocket(sendPort);
}
catch(Exception ex)
{
ex.printStackTrace();
}
//============接受消息============
//匿名类
new Thread(new Runnable()
{
public void run()
{
byte buf[] = new byte[1024];
//表示接受数据报包
while(true)
{
try
{
DatagramPacket dp = new DatagramPacket(buf,1024,InetAddress.getByName(txtIP.getText()),sendPort);
ds.receive(dp);
lst.add("【消息来自】◆" + dp.getAddress().getHostAddress() + "◆"+"【说】:" + new String (buf,0,dp.getLength()) /*+ dp.getPort()*/,0);
}
catch(Exception e)
{
if(ds.isClosed())
{
e.printStackTrace();
}
}
}
}
}).start();
//关闭窗体事件
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
System.out.println("test");
int n=JOptionPane.showConfirmDialog(null,"是否要退出?","退出",JOptionPane.YES_NO_OPTION);
if(n==JOptionPane.YES_OPTION)
{
dispose();
System.exit(0);
ds.close();//关闭ds对象//关闭数据报套接字
}
}
});
}
//界面设计布局
public void CreateInterFace()
{
this.add(lst,BorderLayout.CENTER);
this.add(p,BorderLayout.SOUTH);
p.add(lblIP);
p.add(txtIP);
p.add(lblMSG);
p.add(txtMSG);
p.add(btnSend);
txtIP.setText(sendIP);
//背景颜色
lst.setBackground(Color.yellow);
//JAVA默认风格
this.setUndecorated(true);
this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
this.setSize(600,500);
this.setTitle("〓聊天室〓");
this.setResizable(false);//不能改变窗体大小
this.setLocationRelativeTo(null);//窗体居中
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setVisible(true);
txtMSG.requestFocus();//消息框得到焦点
}
//===============================Main函数===============================
public static void main(String[]args)
{
new Chat();
}
//================================发送消息===============================
//消息框回车发送消息事件
public void actionPerformed(ActionEvent e)
{
//得到文本内容
buf = txtMSG.getText().getBytes();
//判断消息框是否为空
if (txtMSG.getText().length()==0)
{
JOptionPane.showMessageDialog(null,"发送消息不能为空","提示",JOptionPane.WARNING_MESSAGE);
}
else{
try
{
InetAddress address = InetAddress.getByName(sendIP);
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort);
ds.send(dp);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
txtMSG.setText("");//清空消息框
//点发送按钮发送消息事件
if(e.getSource()==btnSend)
{
buf = txtMSG.getText().getBytes();
try
{
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort);
}
catch(Exception ex)
{
ex.printStackTrace();
}
txtMSG.setText("");//清空消息框
txtMSG.requestFocus();
}
}
}
3. 跪求基于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);
}
}
/**//*
*客户端
*/
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);
}
}
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();
}
}
}
}
4. java的一个简单聊天室的系统结构,大概的跟我说一下。
定义要求:⑴完善的支持中文。由于Java编译器版本及运行环境的差异等原因,在Java语言的中文处理中常出现乱码等现象,表现在中文显示与网络传输不正常、中文不能输入等方面。在这个聊天室系统中我们将彻底解决中文的兼容性问题。⑵具有健壮性。即聊天室系统能够处理各种异常,能够识别和控制客户端的各种行为,能够返回清理不正常退出后所分配的系统资源,能够踢出超时连接用户以减轻服务器负载等。虽然Java语言本身能够自动收集处理无用的对象,但我们仍然需要作一定的清理工作。⑶广泛的适应性。因为我们不能要求聊天用户必须使用某种浏览器或操作系统,因此所编写的Java程序,尤其是Applet,必须能在各种平台的各个版本的浏览器上都能正常运行。考虑到网络用户的使用情况,我们定的标准是能适应以下版本的浏览器:Netscape 3.x,Netscape Communicator 4.x,Internet Explorer 3.x、4.x、5.x中英文版。设计实现:基于Java的Web聊天室系统包括聊天服务器和客户端两部分。聊天服务器是一个Java Application,与Web服务器程序运行在同一机器上。客户端部分即是一个含Java Applet的HTML页面,它由Web服务器传送给客户端浏览器,交由浏览器的Java虚拟机(VM)解释执行。该Applet初始化后与聊天服务器进行连接,聊天服务器对于每个连接请求产生一个连接线程(Connection Thread),来维护和管理与该客户端的会话。客户端的发言被传送到服务器端后由其向其他客户进行广播(Broadcast),达到相互聊天的目的。 在聊天服务器中,我们使用哈希表(Hashtable)来存储所有的连接线程。主线程为ChatServer,对于每个新的客户连接请求产生一个Connection线程。同时我们还运行了一个检查线程CheckActiveTimer,它相当于一个定时器,每隔一定时间就扫描所有的客户连接线程(即扫描Hashtable),检查每个客户连接是否超时(例如很长时间没有发言或者死机),并给出警告或直接踢出(Kick)用户。
5. 基于java的网络聊天系统
我有 自己写好的JAR包 QQ传给你 QQ:419000662
请查收~~~
收到请给分呵呵~~~
6. 谁能帮我注释一下下面的java代码,是基于java的聊天系统的server的代码
import mybean.Logininfor;
import setting.Embody;
public class serve {
private ServerSocket serversocket;
private Socket socket = new Socket();
private work work;
private ArrayList arraylist = null;
MyQQServerMain serverMain;
public static serve serve = new serve();
private Vector clientsfind = null;
public static Hashtable<String, Socket> socketsHashtable = new Hashtable<String, Socket>();
public ArrayList getArrayList() {
return this.arraylist;
}
/**
* 获取服务器IP
*/
public static InetAddress getLocalHost() throws UnknownHostException {
InetAddress IP = InetAddress.getLocalHost();
return IP;
}
/**
* 启动服务器
*/
public void start() {
try {
serversocket = new ServerSocket(setting.Command.server_port);
serverMain = new MyQQServerMain();
//这里让那个面板置为可见,可见上面是启动的一个面板啊
serverMain.setVisible(true);
//在内容显示的地方打印出来服务启动的基本信息
serverMain.getJTextArea().append(
serve.getTime()+" " + "服务器启动" + "\n" + "服务器IP是:"
+ (getLocalHost().getHostAddress()) + "\n");
socket.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "此端口被占用,系统将退出"); // 出错,打印出错信息
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 启动线程
*/
public void startThread() {
while (true)// 死循环 一直监听有没有客户端和服务器建立连接
{
try {
socket = serversocket.accept();
serverMain.getJTextArea().append(
serve.getTime()+" "+ "客户端开始连接服务器:" + "\n");
serverMain.getJTextArea().selectAll();
work = new work(serve, socket);
// 对象构造Work
work.start();// 启动线程;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我看了下,这真没什么好注释的了说的多详细啊。
7. 高手进,java实现聊天功能
。。。这个我以前也遇到过、不过我是用C#写的、不过后来也有java的、你可以、使用Swing做的简单界面,及使用Socket套接字实现简单聊天 。。。。。。但是、我不知道你问的是C/S模式还是B/S 模式?
其中、B/S模式可以用Servlet来实现,思路是通过Context上下文绑定参数实现
而C/S模式的,是通过RMI远程调用的方法实现的。。。先给你个C/S模式的核心代码。。。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;public class Server extends JFrame
{
public static void main(String [] args)
{
Server server=new Server();
//设定框架的关闭方式
server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示框架
server.setVisible(true);
server.pack();
CreateServer cs=new CreateServer(server);
}
// 设定框架的宽度和高度
private static final int WIDTH=450;
private static final int HEIGHT=450;
// 聊天信息框
JTextArea mainArea=new JTextArea(12,35);
// 发送信息的填写框
JTextArea sendArea=new JTextArea(5,30);
// 构造函数
public Server()
{
//定位框架
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();//获取电脑当前分辨率
int width=screenSize.width;
int height=screenSize.height;
int x=(width-WIDTH)/2;
int y=(height-HEIGHT)/2;
//设置窗口显示位置
setLocation(x,y);
//设置框架大小
setSize(WIDTH,HEIGHT);
//设置标题
setTitle("小新新聊天服务器");
//设置窗口的自定义大小
setResizable(false);
//在内容表格上创建3个面板并加入到内容表格
Container con=this.getContentPane();
JPanel labelPanel=new LabelPanel();
con.add(labelPanel,BorderLayout.NORTH);
JPanel contentPanel=new ContentPanel();
con.add(contentPanel,BorderLayout.CENTER);
JPanel sendPanel=new SendPanel();
con.add(sendPanel,BorderLayout.SOUTH);
}
//聊天窗口的标题面板
class LabelPanel extends JPanel
{
public LabelPanel()
{
Font font=new Font("Dialog",Font.BOLD,18);
JLabel label=new JLabel("欢迎使用小新新聊天服务器");
label.setFont(font);
this.add(label);
}
}
// 聊天信息查看面板
//该面板内的区域为不可编辑区域
class ContentPanel extends JPanel
{
public ContentPanel()
{
FlowLayout fl=new FlowLayout(FlowLayout.CENTER);
this.setLayout(fl);
mainArea.setLineWrap(true);
mainArea.setEditable(false);
JScrollPane scrollPanel=new JScrollPane(mainArea);
this.add(scrollPanel);
}
}
// 填写发送信息的面板
class SendPanel extends JPanel
{
public SendPanel()
{
//面板的组件之间水平分隔15像素,垂直间距10像素
FlowLayout layout=new FlowLayout(FlowLayout.LEFT,15,10);
this.setLayout(layout);
sendArea.setLineWrap(true);
JScrollPane scrollPanel=new JScrollPane(sendArea);
this.add(scrollPanel);
JButton send=new JButton("发送");
this.add(send);
//对发送按钮注册动作监听器
send.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String msg=sendArea.getText();
if(!msg.equals(""))
{
mainArea.append("【服务器】:"+msg+"\n");
sendArea.setText("");
CreateServer.sendMsg(msg);
}
else
{
return;
}
}
});
}
}
}
//创建服务器ServerSocket的类
class CreateServer extends Thread
{
private Server server;
private static BufferedReader in=null;//存储客户端发送到服务器的数据
private static PrintWriter out=null;//存储服务器发送到客户端的数据
private Socket socket=null;//等待客户端连接socket
private ServerSocket ss=null;//开启服务器socket连接
//构造函数
public CreateServer(Server s)
{
this.server=s;
try
{
ss=new ServerSocket(2345);
System.out.println("服务器成功启动...!");
socket=ss.accept();//等待客户端请求
//获取输入到服务器的数据
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取输出到客户端的数据
out=new PrintWriter(socket.getOutputStream(),true);
out.println("你好!");
}
catch(Exception r)
{
r.printStackTrace();
}
this.start();//启动线程
}
//实现信息发送到客户端的发送方法
public static void sendMsg(String s)
{
try
{
out.println("【服务器】:"+s+"\n");
}
catch(Exception e)
{
System.out.println("发送信息失败...!!");
e.printStackTrace();
}
}
// 线程Thread类的run方法实现对客户端发送来的数据监听
//线程启动后开始该方法,执行线程体
public void run()
{
String msg="";
while(true)
{
try
{
msg=in.readLine();
//Thread.sleep(500);//线程睡眠
}
catch (SocketException ex)
{
ex.printStackTrace();
break;
}
catch(IOException r)
{
r.printStackTrace();
break;
}
//若从客户端获取的信息不为空对象也不为空串
//则把信息显示在聊天信息文本域
if(msg!=null && msg.trim()!="")
{
server.mainArea.append(msg+"\n");
}
}
}
}
8. java聊天软件设计论文
java聊天软件设计论文
摘 要
随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过与服务器建立连接,来进行客户端与客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统
关键词:局域网 聊天 socket java
1 绪论
随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持, 而聊天室是人们最常见, 最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,易于维护和更新,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。
2 规划设计
2.1 课题来源
根据当前网络的需求,网络聊天越来越受各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《基于JAVA聊天设计与实现》为毕业设计,希望通过这一次的能进一步提高本人的网络开发编程的能力。
2.2需求分析
聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务:
1.服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。
2.服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
以上就是服务器端最主要的两个任务。不难看出,服务器端的任务并不复杂。
客户端应该完成的工作包括:
1.与服务器端建立通信通道,向服务器端发送信息。
2.接收来自服务器的信息。
相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,解决上述四个问题,即完成了该聊天系统的核心。
3 系统分析与设计方案
3.1 聊天系统的总体设计要点
聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:
1、实现思想
在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
2、服务器端工作流程
服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。
3、客户端工作流程
客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。