实验任务五
简单聊天程序-实现两台计算机间的交互(客户端与服务器)
1、 系统设计要求
编程实现一个简单的聊天程序,实现两台计算机间的信息交互;客户端发送到服务器后服务器接收消息,并在命令行上显示,然后服务器端按键盘输入后发送给客户端。以对讲机的形式进行信息交流。
2、 设计思路与方案
1) 设计思路
① 客户端设计思路:
- 首先创建与服务器链接的套接字Socket,地址为本机地址,端口号8866。
- 因为服务器端与客户端不能都先获取输入流,这样会导致socket阻塞,故客户端先实例化从服务器读的字节流(服务器端先实例化写的字节流)。然后再实例化从服务器的写的字节流以及键盘输入流。
- 客户端等待服务器发送消息,接收到消息后,在命令行上显示出收到的消息,然后再输入自己想要发送的消息,输入完毕后发送给服务器。
- 客户端再次等待发送消息。。。
② 服务器设计思路: - 首先创建开放链接的套接字Socket,端口号8866。
- 等待客户端链接。
- 链接成功后先实例化向客户端的写字节流,并向其发送默认消息: “你好啊客户端”。然后实例化从客户端的读字节流以及键盘输入流。
- 服务器等待客户端发送消息,接收到消息后,在命令行上显示出客户端发送的消息,然后再输入自己想要发送的消息,输入完毕后发送给客户端。
- 服务器端再次等待客户端发送消息。。。
2) 程序总体框图
3)程序算法模块
①客户端:
//如侵权,请联系删除
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;//与服务器链接的套接字
Scanner fromKey = null;//键盘输入流
Scanner fromServer = null;//获取服务器发送的字节流
PrintWriter toServer = null;//向服务器发送的字节流
try {
//链接服务器的套接字
socket = new Socket("localhost",8866);
/*
注意:服务器端与客户端不能都先获取输入流,这样会导致socket阻塞
*/
//实例化从服务器读的字节流
fromServer = new Scanner(socket.getInputStream());
//实例化向服务器写的字节流
toServer = new PrintWriter(socket.getOutputStream());
//实例化键盘输入流
fromKey = new Scanner(System.in);
while(fromServer.hasNextLine()){
//阻塞等待服务器发送消息
String fromServerData = fromServer.nextLine();
System.out.println("服务器 :" + fromServerData);
System.out.print("我(客户端) :");
//获取输入的数据
String toServerData = fromKey.nextLine();
//发送给服务器
toServer.println(toServerData);
toServer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fromServer.close();
toServer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
②服务端:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) {
ServerSocket ServerSocket = null;//开放的套接字
Socket socket = null;//链接客户端的套接字
Scanner fromKey = null;//键盘输入流
Scanner fromClient = null;//获取从客户端读的字节流
PrintWriter toClient = null;//获取向客户端写的字节流
try {
ServerSocket = new ServerSocket(8866);
System.out.println("服务器已启动,等待客户端链接");
//链接客户端的套接字
socket = ServerSocket.accept();
//实例化向客户端写的字节流
toClient = new PrintWriter(socket.getOutputStream());
toClient.println("你好啊客户端!!!");
toClient.flush();
System.out.println("我(服务器端) : 你好啊客户端!!!");
//实例化从服务器读的字节流
fromClient = new Scanner(socket.getInputStream());
//实例化键盘输入流
fromKey = new Scanner(System.in);
//阻塞等待客户端发送消息
while(fromClient.hasNextLine()){
String fromClientData = fromClient.nextLine();
System.out.println("客户端 :" + fromClientData);
System.out.print("我(服务器端) :");
//获取输入的数据
String toClientData = fromKey.nextLine();
//发送给客户端
toClient.println(toClientData);
toClient.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fromClient.close();
toClient.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4)运行结果:
①打开服务器:
②打开客户端:
③通信结果: