实验七 网络程序设计实验

注意

完整实验报告及源码链接:https://download.csdn.net/download/qq_29711355/85641623

一、实验目的:

练习Socket网络访问方法,理解网络程序的设计思想与实现方法。

二、实验内容:

设计网络聊天程序,实现如下功能:
(1)聊天两端具有相同的界面,包括能输入消息的文本框、发送消息按钮、消息列表文本框;
(2)任意一端均可以实时发送和接收消息,并在自身的消息列表中显示消息记录。

三、实验要求:

1、正确设计图形用户界面;
2、完成网络访问的界面和功能设计;
3、进行测试并分析测试结果;
4、简要说明你在该实验中的收获与体会。

参考代码

Client 类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Client {//客户端
	
	private Socket socket;
	private InputStream in;
	private OutputStream out;
	private PrintWriter writer;
	private BufferedReader reader;
	private MessageAble msgAble;
	
	public Client(String host,int port,MessageAble msgAble) {
		this.msgAble = msgAble;
		try {
			socket = new Socket(host,port);//发出请求,主机地址、端口
			in = socket.getInputStream();
			out = socket.getOutputStream();
			writer = new PrintWriter(out);//把out包装一下
			reader = new BufferedReader(
					new InputStreamReader(in));
			startReceiveMsg();//开始接受消息
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void sendMessage(String msg) {
		writer.println(msg);
		writer.flush();//传消息
	}
	
	private void startReceiveMsg(){//开始监听接收消息 一接受到就打印出来
		new Thread(//一个匿名内部类来启动线程,监听reader有没得内容,一旦有,就打印出来
				new Runnable() {
					public void run() {
						// TODO Auto-generated method stub
							try {
							String line;
							while((line = reader.readLine())!=null) {//一个死循环 一直监听
								//System.out.println(line);
								msgAble.dealMessage(line);
							}
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}).start();
	}
	
	public void close() {
		try {
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

ClientUI 类

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class ClientUI {
	private JTextArea chatArea;
	private JTextField messageField;
	private Client client;
	private JTextField adressField;
	
	public ClientUI() {
		JFrame frame = new JFrame("客户端");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800,1000);
		
		frame.setLayout(new BorderLayout());
		
		chatArea = new JTextArea();//聊天框
		chatArea.setFont(new Font("微软雅黑",Font.BOLD,30));
		JScrollPane scrollPane = new JScrollPane(chatArea);
		frame.add(scrollPane,BorderLayout.CENTER);
		
		JPanel panel = new JPanel();
		messageField = new JTextField();
		messageField.setColumns(20);
		messageField.setFont(new Font("微软雅黑",Font.BOLD,30));
		
		JButton sentBtn = new JButton("发送");
		sentBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String msg = messageField.getText();
				chatArea.append("服务端:"+msg+"\n");
				client.sendMessage(msg);
			}
		});
		panel.add(messageField);
		panel.add(sentBtn);
		frame.add(panel,BorderLayout.SOUTH);
		
		JPanel northPan = new JPanel();
		northPan.add(new JLabel("连接:"));
		adressField = new JTextField();
		adressField.setColumns(20);
		JButton startBtn = new JButton("连接");
		startBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				startConnect();
			}
		});
		
		northPan.add(adressField);
		northPan.add(startBtn);
		frame.add(northPan,BorderLayout.NORTH);
		
		
		frame.setVisible(true);
		
	}
	
	private void startConnect() {
		String address = adressField.getText();
		String[] strs=address.split(":");
		String host = strs[0];
		int port = Integer.parseInt(strs[1]);
		
		client = new Client(host,port,new MessageAble() {//构造server的时候就告诉服务器接收到的消息由ui这边来处理
			public void dealMessage(String msg) {
				//处理接收到的消息
				chatArea.append("客户端:"+msg+"\n");
			}
		});
	}
	public static void main(String[] args) {
		new ClientUI();
	}

}

MessageAble 类


public interface MessageAble {
	public void dealMessage(String msg);

}

Server 类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	private ServerSocket serverSocket;
	private InputStream in;
	private OutputStream out;
	private PrintWriter writer;
	private BufferedReader reader;
	private MessageAble messageAble;
	//在构造函数中开始监听,当有用户连上后,就产生输入输出流对象,并且开始接收消息
	public Server(int port, MessageAble messageAble) {//服务器程序
		this.messageAble = messageAble;//谁调用谁处理
		try {
			serverSocket = new ServerSocket(port);
			//只有一个客户端一个服务器所以我们直接accept 不用担心被阻塞
			Socket socket = serverSocket.accept();//等待客户端发出链接请求
			in = socket.getInputStream();//把输入输出流流进行保存
			out = socket.getOutputStream();
			writer = new PrintWriter(out);//把out包装一下,可以发送字符串
			reader = new BufferedReader(
					new InputStreamReader(in));//字节流包装成字符流
			startReceiveMsg();//开始接受消息
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void sendMessage(String msg) {//发消息
		writer.println(msg);
		writer.flush();//传消息
	}
	
	private void startReceiveMsg(){//开始监听接收消息 一接受到就打印出来
		new Thread(//一个匿名内部类来启动线程,监听reader有没得内容,一旦有,就打印出来
			new Runnable() {//非Thread类子类的类提供的一种激活方式,Runnable只有一个run方法
				public void run() {
					String line;
						try {
						while((line = reader.readLine())!=null) {//一个死循环 一直监听,监听reader
							//System.out.println(line);
							messageAble.dealMessage(line);
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
					}
				}
				).start();
	}
	
	public void close() {//关闭
		try {
			serverSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

ServerUI 类

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class ServerUI {
	private JTextArea chatArea;
	private JTextField messageField;
	private Server server;
	private JTextField portField;
	
	public ServerUI() {
		JFrame frame = new JFrame("服务器");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800,1000);
		
		frame.setLayout(new BorderLayout());
		
		chatArea = new JTextArea();//聊天框
		chatArea.setFont(new Font("微软雅黑",Font.BOLD,30));
//		JScrollPane scrollPane = new JScrollPane(chatArea);
		frame.add(chatArea,BorderLayout.CENTER);
		
		JPanel panel = new JPanel();
		messageField = new JTextField();
		messageField.setColumns(20);
		messageField.setFont(new Font("微软雅黑",Font.BOLD,30));
		
		JButton sentBtn = new JButton("发送");
		sentBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String msg = messageField.getText();
				chatArea.append("服务端:"+msg+"\n");
				server.sendMessage(msg);
			}
		});
		panel.add(messageField);
		panel.add(sentBtn);
		frame.add(panel,BorderLayout.SOUTH);
		
		JPanel northPan = new JPanel();
		northPan.add(new JLabel("监听端口:"));
		portField = new JTextField();//输入框
		portField.setColumns(20);
		JButton startBtn = new JButton("监听");
		startBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				startServer();
			}
		});
		
		northPan.add(portField);
		northPan.add(startBtn);
		frame.add(northPan,BorderLayout.NORTH);
		
		
		frame.setVisible(true);
		
	}
	
	private void startServer() {
		int port = Integer.parseInt(portField.getText());
		server = new Server(port,new MessageAble() {//构造server的时候就告诉服务器接收到的消息由ui这边来处理
			public void dealMessage(String msg) {
				//处理接收到的消息
				chatArea.append("客户端:"+msg+"\n");
			}
		});
	}
	public static void main(String[] args) {
		new ServerUI();
	}

}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一共包括10个以上的聊天程序版本!绝对物有所值! 为感谢大家长期的支持,我将下载所需的资源分下调为2。网络聊天程序设计(可选)  实验要求 1、分析典型网络聊天应用软件(如QQ、MSN等)的实现原理,模拟设计一套网络聊天应用程序,必须实现以下功能: ①按照C/S结构分别设计服务端程序和客户端程序; ②服务端通过图形用户界面实现对服务器的控制,负责维护用户帐户和用户群,并维护用户信息、维持客户端之间的端对端通信和群聊通信、适时维护用户在线信息,并能够发送广播消息。 2、增加尽可能多的功能,用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 3、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。  实验提示 1、客户端之间的通信是通过服务器进行转发的,对于两个客户端,服务器需要创建两个套接字分别维持与客户端之间的连接。当客户端需要向另一个客户发送消息时,它首先将消息发送到服务器,由服务器根据目标用户帐户转发到目标主机。 2、群聊是采用多播技术实现的,也可以采用单播技术实现,但是服务器开销会增加。具体说来,若采用组播技术,当服务端收到来自一个客户端的消息后,向预先分配的该组组播地址转发该消息。若采用单播技术,服务端需要向该组内的所有客户端一一转发该消息。 3、广播消息通过广播方式发送由服务端创建的消息。 4、服务端根据客户的连接和断开情况,实时向其它客户端发送用户在线信息。 实验题目二:自选网络通信程序设计(可选)  实验要求 可以自选与网络通信相关的设计题目,要求如下: 1、在确定实验题目、设计内容以及设计功能指标要求后,向实验指导教师提交书面申请,由实验指导教师根据所选实验题目的难度和工作量确定立题后方能开始实验。 2、选择的实验题目必须具有一定综合性,并能够利用网络通信原理加以解决,同时需要具备一定的工作量。 3、设计的结果要求用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 4、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。 5、严禁抄袭别人成果,但可以部分借鉴。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无奈清风吹过

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

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

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

打赏作者

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

抵扣说明:

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

余额充值