《高级Internet》实验报告
题目: Socket
网络编程
学生姓名: 班 级: 学 号:
指导老师: 王文浪 成 绩:
西安邮电大学计算机学院 2015 年 4 月 27 日
一、 实验目的
①
② ③ ④ ⑤
熟悉Socket网络编程 熟悉CS客户机模式
熟悉ServerSocket编写服务端 熟悉使用多线程机制处理业务 了解客户机之间通信方式
二、 实验内容及要求
①
② ③ ④ ⑤ ⑥
采用CS模式,通过客户机向服务器端发送消息; 采用Socket来实现客户机之间的网络通信;
通过ServerSocket创建服务端来处理接受客户机请求; 通过多线程方式来处理客户机之间的通信请求; 实现通信的界面窗口;
实验内容有发送私聊消息、向选中用户发送文件、用户接受文件。
三、 实验过程
① 确定编程语言,架构方式,实及通信的协议
编程语言:Java;
结构方式:CS客户机模式;
通信协议:在过程中为每一条通信的信息设定一个type参数,标志着通信的类型; 1:向选中用户发送私信; 0: 上下线更新 -1:下线请求 2:请求发送文件 3:确定接收文件
② 创建工程项目SuperInternet_Client(客户机) SuperInternet_Server(服务器端) 项目客户机目录结构: 项目的服务器端目录结构:
③ 创建登录界面ChatLogin.java 1)(客户机)实现的核心代码:
//监听登录按钮事件(登录时从配置文件中读取用户的配置信息)btnLoginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //读取配置文件 Properties userProperties = new Properties(); File file = new File(\); //加载配置文件的信息 LoadPropertiesUtil.loadPro(userProperties, file); //获得输入用户名 String uname = textField.getText().toString(); if(file.length() != 0) { //在配置文件中是以键值对的方式存放用户的信息,用户名(key)=密码值(value) if(userProperties.containsKey(uname)) { //配置文件中包含该用户 //获取密码框输入的用户名 String upass = new String(passwordField.getPassword()); //判断用户密码是否正确 if(upass.equals(userProperties.getProperty(uname))) { //创建网络连接并显示聊天窗口 System.out.println(\连接成功!!\); try { //创建本地网络连接,端口为8080 Socket client = new Socket(\,8080); //将登录按钮设置为不可编辑 btnLoginButton.setEnabled(false); //登录成功,打开聊天窗口 ChatRoom chatroom = new ChatRoom(uname,client); chatroom.setVisible(true);//显示聊天窗口 setVisible(false);//隐藏登录窗口 } catch (UnknownHostException e1) { e1.printStackTrace(); ErrorInfoShowUtil.errorTip(\连接服务器失败,请重新登录!\, contentPanel); } catch (IOException e1) { e1.printStackTrace(); ErrorInfoShowUtil.errorTip(\连接服务器失败,请重新登录!\, contentPanel); } }else { lblPrompt.setText(\您输入的密码错误!\);...后续省略 } });
2) 创建登录界面中调用的工具类
读取配置文件工具类(LoadPropertiesUtil),实现的核心代码:
public class LoadPropertiesUtil { /** * 加载配置文件的信息 * @param properties * @param file */ public static void loadPro(Properties properties,File file) { //文件不存在,创建该文件 if(!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); System.out.println(\创建配置文件失败,请检查!\); } } //加载配置文件的信息 try { properties.load(new FileInputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 错误信息窗口工具类(ErrorInfoShowUtil.java),实现核心代码:
/** * 显示错误连接错误提示框 * @author XiyouJackielin * */ public class ErrorInfoShowUtil { public static void errorTip(String errorInfo,JPanel contentPanel) { JOptionPane.showMessageDialog(contentPanel, errorInfo, \, JOptionPane.ERROR_MESSAGE); } }
3) 编写服务器端ChatServer.java,接收客户机的请求连接,并返回当前在线人数:
服务器端中的静态区初始化监听连接端口及在线人数集合变量 /** * 服务器端,将听客户端请求并处理请求 * @author XiyouJackielin * */ public class ChatServer { //创建服务器端的socket private static ServerSocket serverSocket; //创建集合存放在线的用户 private static HashMap
1)用户输入注册的信息,首先先在配置文件中寻找是否有相同的用户名,如果存在相同的用户名,则提示用户名已经重复,重新输入;
2)验证用户输入的信息,如果两次密码输入不一致,则提示密码错误;
3)用户输入注册信息验证通过后,打开配置文件Userinfo.properties,将注册信息保存至配置文件中;
@Override public void actionPerformed(ActionEvent e) { Properties userProperties = new Properties(); File file = new File(\); LoadPropertiesUtil.loadPro(userProperties, file); String uname = textField.getText().toString(); String upass = new String(passwordField.getPassword()); String confirmPass = new String(confirmpasswordField.getPassword()); //判断配置文件中是否存在该用户 if(uname.length() != 0) { if(userProperties.containsKey(\)) { lblPrompt.setText(\该用户名已经存在!\); .....//后续省略}
相关推荐: