JAVA即时通信系统指导书资料.docx
- 文档编号:27491918
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:48
- 大小:395.21KB
JAVA即时通信系统指导书资料.docx
《JAVA即时通信系统指导书资料.docx》由会员分享,可在线阅读,更多相关《JAVA即时通信系统指导书资料.docx(48页珍藏版)》请在冰豆网上搜索。
JAVA即时通信系统指导书资料
JAVA编写即时通信系统指导书
一、即时通信系统简介
1、模拟聊天系统包含两个方面,服务器端和客户端。
2、服务器端任务:
建立一个ServerSocket,与客户端建立通信通道,不断侦听是否有客户端连接或者断开连接。
服务器端是一个信息转发中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
3、客户端任务:
建立一个Socket,与服务器端建立通信通道,向服务器端发送信息,并接收来自服务器的信息。
二、即时通信系统测试
1、服务器端运行Server.java。
弹出如图1-1所示图形界面,点击“开始”,将弹出如图1-2所示图形界面,服务器即打开。
图1-1图1-2
2、客户端运行Client.java,将弹出如图1-3所示图形界面,输入服务器的ip,port,以及帐户名(自已姓名)登录,将弹出如图1-4所示图形界面。
点击如图1-5所示图形界面的下拉列表,在发送框中输入信息发送,就可以进行群聊或私聊。
图1-3图1-4图1-5
三、即时通信系统设计与实现操作步骤。
任务一
(1)目的:
通过网络编程,让客户端与服务器端互通字节信息。
老师做服务器,学生做客户端。
具体操作步骤:
教师与学生都新建一个javaproject,命名如zhangsanQQchat(以本人姓名+QQchat为文件名),在src下新建一个other包,教师在other包下新建Server.java类并运行。
指导学生在other包下新建Client.java类并运行,学生逐个与教师连接测试。
通过测试,教师检查学生完成情况并记录。
Server.java代码如下:
importjava.io.*;
import.*;
publicclassServer{
publicstaticvoidmain(String[]args){
ServerSocketserver;
try{
server=newServerSocket(1234);
Socketsk=server.accept();
InputStreamis=sk.getInputStream();
inti;
System.out.println("这是服务器端接收到的信息");
while((i=is.read())!
=-1){
System.out.print((char)i);
}
server.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
Client.java代码如下:
importjava.io.*;
import.*;
publicclassClient{
publicstaticvoidmain(String[]args){
Socketclient;
try{
client=newSocket("localhost",1234);
OutputStreamos=client.getOutputStream();
os.write('z');
os.write('h');
os.write('a');
os.write('n');
os.write('s');
os.close();
client.close();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
任务二
(2)目的:
通过网络编程,让同学们与老师互通字节信息。
学生做服务器,老师做客户端。
指导学生在other包下新建Server.java类并运行。
教师在other包下新建Client.java类并运行,逐个与学生连接测试,教师检查学生完成情况并记录。
代码同上。
网络编程总结如下:
1、在服务器端先定义一个Server.java类。
①在此类中的main方法中,创建一个ServerSocket实例,指定打开一个端口,让其它机器访问。
②此ServerSocket实例调用方法accept()来等待其它机器连接,若有连接返回一个Socket实例③Socket实例可以调用getInputStream()方法获取客户端发来的信息。
④将这些信息输出,关闭各种流及连接。
2、在客户端定义一个Client.java类。
①在此类中main方法中,通过对指定服务器端的连接获取一个Socket实例②调用这个Socket实例的getOutputStream()方法获取一个输出流,通过输出流往服务器发送信息③关闭各种流及连接
3、学生先跟老师通信,然后两个同学一组,互相做客户端与服务器端,理解网络编程的基本知识。
4、由于没有引入线程知识,在做服务器端时,每连接一次后,都要重新运行Server.java。
任务三目的:
通过网络编程,让同学们与老师互通字符信息。
将Server.java与Client.java修改并运行。
通过教师与学生互动测试,教师检查学生完成情况并记录。
Server.java代码修改如下:
importjava.io.*;
import.*;
publicclassServer{
publicstaticvoidmain(String[]args){
ServerSocketserver;
try{
server=newServerSocket(1234);
Socketsk=server.accept();
//返回一个字节输入流
InputStreamis=sk.getInputStream();
//将字节流转化为字符流
InputStreamReaderisr=newInputStreamReader(is);
//将字符流转化为缓存流
BufferedReaderbr=newBufferedReader(isr);
Strings=br.readLine();
System.out.println("这是服务器端接收到的信息");
System.out.println(s);
br.close();
server.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
Client.java代码修改如下:
importjava.io.*;
import.*;
publicclassClient{
publicstaticvoidmain(String[]args){
Socketclient;
try{
client=newSocket("localhost",1234);
//获取一个字节输出流
OutputStreamos=client.getOutputStream();
//将字节输出流转化为字符输出流
OutputStreamWriterosw=newOutputStreamWriter(os);
//将字符输出流转化为缓存流
BufferedWriterbw=newBufferedWriter(osw);
bw.write("我是张三,老师好");
bw.close();
client.close();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
任务总结:
从上面的案例,在服务器端发现了一个缺点,每次只能与一个客户端连接,连接成功后就会退出。
如何解决问题,在服务器端加上线程。
任务四(3)目的:
在服务器端加上线程,要求服务器能与多个客户端联系。
教师做服务器端,并启动服务器端,与多个同学连接,通过教师与学生互动测试,教师检查学生完成情况并记录。
publicclassServer{
publicstaticvoidmain(String[]args){
System.out.println("这是包含线程的服务器");
ConServerThreadcst=newConServerThread();
cst.startServer();
newThread(cst).start();
}
}
publicclassConServerThreadimplementsRunnable{
//这是包含线程的服务器
ServerSocketserverSocket;
intcount=0;
publicvoidstartServer(){
try{
serverSocket=newServerSocket(8000);
}catch(IOExceptione){
e.printStackTrace();
}
}
publicvoidrun(){
try{
while(true){
SocketclientSocket=serverSocket.accept();
InputStreamins=clientSocket.getInputStream();
/*以下三行代码也可以接收字符流
InputStreamReaderisr=newInputStreamReader(ins);
BufferedReaderbfr=newBufferedReader(isr);
Stringstr=bfr.readLine();
*/
//推荐使用下面方法接收字符
DataInputStreamdis=newDataInputStream(ins);
Stringstr=dis.readUTF();
System.out.println("这是从客户端传过来的信息:
"+str);
count++;
System.out.println("这是第"+count+"个连接客户");
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
客户端代码
importjava.io.BufferedWriter;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
import.Socket;
import.UnknownHostException;
publicclassClient{
publicstaticvoidmain(String[]args){
Socketclient;
try{
client=newSocket("localhost",8000);
//获取一个字节输出流
OutputStreamos=client.getOutputStream();
//将字节输出流转化为字符输出流
OutputStreamWriterosw=newOutputStreamWriter(os);
//将字符输出流转化为缓存流
DataOutputStreamdos=newDataOutputStream(os);
//BufferedWriterbw=newBufferedWriter(osw);
//bw.write("我是张三,老师好");
dos.writeUTF("我是张三,老师好");
dos.close();
//bw.close();
client.close();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
任务五目的:
客户端代码不变,在服务器端加上线程。
学生做服务器端,并启动服务器端,教师逐个与每个同学连接,通过教师与学生互动测试,教师检查学生完成情况并记录。
任务总结:
流的知识回顾,BufferedWriter中的方法BufferedWriter()有这个一样缺点,当我们输入文字太少的时候,如果缓存没装满的时候,它不会发送出去,除非调用close方法。
在实际操作中,同学们信息发送不成功的同学可能就是这个原因。
这个方法不便于连续发送,所以采用DataInputStream(InputSream)来处理InputStream,调用他的readUTF()方法来读,输出流也一样,调用writerUTF()方法来写,它就不要求关闭,可以连续写与读内容。
另外从任务四中,在服务器端又发现了一个缺点,虽然可以与多个客户端连接,但每次只能接收一句话。
如何解决问题,在服务器端再加线程。
任务六(4)目的:
客户端代码不变,在服务器端加上线程,要求完成服务器不仅要与多个客户端连接,而且可以接受一个客户的多条语句。
教师做服务器端,并启动服务器端,每个同学与服务器连接,通过教师与学生互动测试,教师检查学生完成情况并记录。
importjava.io.DataInputStream;
importjava.io.IOException;
importjava.io.InputStream;
import.ServerSocket;
import.Socket;
publicclassServer{
ServerSocketserverSocket;
publicServer(){
try{
serverSocket=newServerSocket(8000);
newThread(newStartServerThread()).start();
}catch(IOExceptione){
e.printStackTrace();
}
}
//下面这个线程类中类,能够完成服务器可以与多个客户端连接,不用线程的话与一个客户端连接后就会结束程序。
classStartServerThreadimplementsRunnable{
SocketclientSocket;
publicvoidrun(){
while(true){
try{
clientSocket=serverSocket.accept();
newThread(newServerReadThread(clientSocket)).start();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
//下面这个线程类中类,能够完成服务器可以可以接受一个客户的多条信息。
不用线程的话,服务器只能接受一条语句。
classServerReadThreadimplementsRunnable{
SocketclientSocket;
publicServerReadThread(SocketclientSocket){
this.clientSocket=clientSocket;
}
publicvoidrun(){
try{
InputStreamins=clientSocket.getInputStream();
DataInputStreamdataIn=newDataInputStream(ins);
while(true){
Stringstr=null;
if(dataIn.available()>0)
str=dataIn.readUTF();
if(str!
=null)
System.out.println(str);
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[]args){
newServer();
}
}
任务七目的:
客户端代码不变,在服务器端加上线程,要求完成服务器不仅要与多个客户端连接,而且可以接受一个客户的多条语句。
学生做服务器端,并启动服务器端,教师作为客户端逐个与每个同学连接,通过教师与学生互动测试,教师检查学生完成情况并记录。
任务八(5)目的:
在src/client,src/server下创建图形界面文件。
其中图1-6为文件GuiServer.java运行结果,该文件在src/server下,图1-7为文件GuiClientMain.java运行结果,图1-8为文件CuiClient.java运行结果,文件所在目录结构如图1-9所示。
图1-6图1-7
图1-8图1-9
注意:
学生完成了以上图形界面类的创建,教师作为一次作业检查,学生保存,由于图形界面不是重点,为便于逻辑的实现,统一教学进度,下面的图形界面统一采用教师提供的文件,学生将老师提供的图形界面复制到自已相应的包下(图形界面文件素材在“即时通信系统素材”下的“图形界面”下),如上图1-9所示。
学生可以在业余时间,采用自已设计的图形界面完成本项目。
附三个文件的代码GuiServer.java:
importjava.awt.BorderLayout;
importjava.awt.Frame;
importjavax.swing.JButton;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
publicclassGuiServerextendsFrame{
//写三个组件
privateJTextAreatext=newJTextArea("",10,40);
privateJButtonstartButton=newJButton("开始");
privateJButtoncloseButton=newJButton("结束");
//写了三个容器
privateJPanelp1=newJPanel();
privateJPanelp2=newJPanel();
privateJPanelp3=newJPanel();
publicGuiServer(){
super("某某服务器");
p1.add(startButton);
p1.add(closeButton);
p2.add(text);
this.add(p2,BorderLayout.NORTH);
this.add(p1,BorderLayout.CENTER);
this.pack();
this.setVisible(true);
}
}
importjava.awt.Dimension;
importjava.awt.FlowLayout;
importjava.awt.GridLayout;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
publicclassGuiClientMainextendsJFrame{
privateJTextFieldaddress;
privateJTextFieldport;
privateJTextFielduserName;
privateJButtonloginButton;
privateJButtonqutiButton;
privateJFrameclientmainframe;
publicGuiClientMain(Stringstr){
super(str);
clientmainframe=this;
JLabelJLabel1=newJLabel("服务器IP:
");
JLabelJLabel2=newJLabel("服务器port:
");
JLabelJLabel3=newJLabel("QQ用户名:
");
this.loginButton=newJButton("登录");
this.qutiButton=newJButton("取消");
this.address=newJTextField(null,20);
this.port=newJTextField(null,20);
this.userName=newJTextField(null,20);
JPanelp1=newJPanel();
JPanelp2=newJPanel();
JPanelp3=newJPanel();
JPanelp4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 即时 通信 系统 指导书 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)