通信软件基础B-重庆邮电大学-Java-简单聊天程序-实现两台计算机间的交互

实验任务五

简单聊天程序-实现两台计算机间的交互(客户端与服务器)

1、 系统设计要求

编程实现一个简单的聊天程序,实现两台计算机间的信息交互;客户端发送到服务器后服务器接收消息,并在命令行上显示,然后服务器端按键盘输入后发送给客户端。以对讲机的形式进行信息交流。

2、 设计思路与方案

1) 设计思路
① 客户端设计思路:

  1. 首先创建与服务器链接的套接字Socket,地址为本机地址,端口号8866。
  2. 因为服务器端与客户端不能都先获取输入流,这样会导致socket阻塞,故客户端先实例化从服务器读的字节流(服务器端先实例化写的字节流)。然后再实例化从服务器的写的字节流以及键盘输入流。
  3. 客户端等待服务器发送消息,接收到消息后,在命令行上显示出收到的消息,然后再输入自己想要发送的消息,输入完毕后发送给服务器。
  4. 客户端再次等待发送消息。。。
    ② 服务器设计思路:
  5. 首先创建开放链接的套接字Socket,端口号8866。
  6. 等待客户端链接。
  7. 链接成功后先实例化向客户端的写字节流,并向其发送默认消息: “你好啊客户端”。然后实例化从客户端的读字节流以及键盘输入流。
  8. 服务器等待客户端发送消息,接收到消息后,在命令行上显示出客户端发送的消息,然后再输入自己想要发送的消息,输入完毕后发送给客户端。
  9. 服务器端再次等待客户端发送消息。。。
    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)运行结果:
①打开服务器:
在这里插入图片描述
②打开客户端:
在这里插入图片描述
③通信结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daydreamer_777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值