一、实验名称
Java聊天室
二、实验目的与要求
1.目的:编写一个小型Java聊天室系统,掌握Java网络通信、多线程、IO文件操作等高级应用编程技能。
2.要求:以课本第15章 Java网络通信例15.3、15.4的源代码为基础,编写一个基于TCP socket套接字的小型C/S Java聊天室系统。
3.完成如下功能:
a、多客户端模式下,实现客户与客户的单独通信,要求信息通过服务器中转
b、端到端的通信,实现并行通信模式(不再是你说一句,我说一句,一端的信息发送不受另一端的影响)
c、实现端到端的文件传输
d、添加图形界面
三、实验步骤与问题
运行课本例15.3的支持单客户的TCP socket套接字C/S程序。
客户端:
第一步:创建Socket
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
//向本机的4700端口发出客户请求
Socket socket=new
Socket("127.0.0.1",4700);
}catch(IOException e) {
System.out.println("can not listen to:"+e);
}
第二步:获取连接到套接字的输入输出流
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由系统标准输入设备构造BufferedReader对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
第三步:对Socket的输入输出流进行读写操作
String readline;
readline=sin.readLine(); //从系统标准输入读入一字符串
while(!readline.equals("bye")){
//将从系统标准输入读入的字符串输出到Server
os.println(readline);
os.flush();//刷新输出流,使Server马上收到该字符串
//在系统标准输出上打印读入的字符串
System.out.println("Client:"+readline);
//从Server读入一字符串,并打印到标准输出上
System.out.println("Server:"+is.readLine());
readline=sin.readLine(); //从系统标准输入读入一字符串
}
第四步:关闭Socket
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
服务器端:
第一步:创建Socket
import java.io.*;
import java.net.*;
public class TalkServer{
public static void main(String args[]) {
ServerSocket server=null;
try{
//创建一个ServerSocket在端口4700监听客户请求
server=new ServerSocket(4700);
}catch(IOException e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行
socket=server.accept();
}catch(IOException e){
System.out.println("Error."+e);
}
第二步:获取连接到套接字的输入输出流
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader is=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
//由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由系统标准输入设备构造BufferedReader对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
第三步:对Socket的输入输出流进行读写操作
//在标准输出上打印从客户端读入的字符串
System.out.println("Client:"+is.readLine());
line=sin.readLine();//从标准输入读入一字符串
while(!line.equals("bye")){
os.println(line); //向客户端输出该字符串
os.flush(); //刷新输出流,使Client马上收到该字符串
System.out.println("Server:"+line);
//从Client读入一字符串,并打印到标准输出上
System.out.println("Client:"+is.readLine());
line=sin.readLine(); //从系统标准输入读入一字符串
}
第四步:关闭Socket
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
/在本机上建立Java工程,分别运行客户端、服务端程序,切换客户端/服务端控制台,交替输入聊天消息,体验客户端/服务端聊天对话过程。但是启动一次服务端程序,启动两次客户端程序,在两个客户端控制台输入聊天消息,观察服务端的控制台运行结果,此时服务端程序仅能支持第一个客户端的请求。
运行结果:刚开始的时候由于学习不够细心,直接先运行了客户端的代码,报错:can not listen to:java.net.ConnectException: Connection timed out: connect
后来经过探讨后,才明白,需要先启动服务端,等待客户端发送请求,当收到客户端请求之后,客户端得以与服务端连接,然后服务端再确认消息段,之后才开始通信。/