分享一波新浪java面试题与参考答案解析

本文详述了新浪Java面试中关于网络编程的题目,包括客户端与服务器端的socket通信,以及用户登录、退出和消息发送的实现。服务器端使用HashMap存储用户信息,客户端通过特定消息协议与服务器交互。文章提供了消息格式设计,并展示了运行结果。
摘要由CSDN通过智能技术生成

点关注,不迷路;持续更新Java相关技术及资讯!!!

在这里插入图片描述

本文主要介绍了新浪java面试题与参考答案,总结分析了新浪java面试网络编程题目与参考答案,涉及java socket通信客户端与服务器端功能实现技巧,需要的朋友可以参考下

在服务器端 用一个HashMap<userName,socket> 维护所有用户相关的信息,从而能够保证和所有的用户进行通讯。

客户端的动作:
(1)连接(登录):发送userName 服务器的对应动作:1)界面显示,2)通知其他用户关于你登录的信息, 3)把其他在线用户的userName通知当前用户 4)开启一个线程专门为当前线程服务
(2)退出(注销):
(3)发送消息

※※发送通讯内容之后,对方如何知道是干什么,通过消息协议来实现:

客户端向服务器发的消息格式设计:
命令关键字@#接收方@#消息内容@#发送方

1)连接:userName ----握手的线程serverSocket专门接收该消息,其它的由服务器新开的与客户进行通讯的socket来接收

2)退出:exit@#全部@#null@#userName

3)发送: on @# JList.getSelectedValue() @# tfdMsg.getText() @# tfdUserName.getText()
服务器向客户端发的消息格式设计:
命令关键字@#发送方@#消息内容

登录:

  1. msg @#server @# 用户[userName]登录了 (给客户端显示用的)
  2. cmdAdd@#server @# userName (给客户端维护在线用户列表用的)
    退出:
  3. msg @#server @# 用户[userName]退出了 (给客户端显示用的)
  4. cmdRed@#server @# userName (给客户端维护在线用户列表用的)
    发送:
    msg @#消息发送者( msgs[3] ) @# 消息内容 (msgs[2])
    运行结果如下:
package cn.hncu;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.border.TitledBorder;
public class ServerForm extends JFrame{
   
    private DefaultListModel lm;
    private JTextArea area;
    private final static int PORT=10010;
    private Map<String, Socket> map=new HashMap<String, Socket>();
        public ServerForm() {
   
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                //setBounds(x, y, width, height)
                final int winWidth=(int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
                final int winHeight=(int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
                setBounds(winWidth/4, winHeight/4, winWidth/2, winHeight/2);
                //加聊天面板
                area=new JTextArea();
                area.setEditable(false);
                this.getContentPane().add(new JScrollPane(area),BorderLayout.CENTER);
                lm=new DefaultListModel();
                JList list=new JList(lm);
                JScrollPane js=new JScrollPane(list);
                js.setBorder(new TitledBorder("在线"));
                js.setPreferredSize(new Dimension(180, this.getHeight()));
                getContentPane().add(js,BorderLayout.EAST);
                JMenuBar bar=new JMenuBar();
                JMenu menu=new JMenu("控制");
                menu.setMnemonic('C');//助记符
                final JMenuItem run=new JMenuItem("开启");
                run.setAccelerator(KeyStroke.getKeyStroke('R',KeyEvent.CTRL_MASK));//设置快捷键ctrl+R
                run.setActionCommand("run");
                menu.add(run);
                menu.addSeparator();
                JMenuItem exit=new JMenuItem("退出");
                exit.setAccelerator(KeyStroke.getKeyStroke('E',KeyEvent.CTRL_MASK));
                exit.setActionCommand("exit");
                menu.add(exit);
                bar.add(menu);
                setJMenuBar(bar);
                //监听
                ActionListener action=new ActionListener() {
   
                        @Override
                        public void actionPerformed(ActionEvent e) {
   
                if(e.getActionCommand().equals("run")){
   
                        startServer();
                        run.setEnabled(false);
                }else{
   
                        System.exit(0);
                }
                        }
                };
                run.addActionListener(action);
                exit.addActionListener(action);
                setVisible(true);
        }
        public static void main(String[] args) {
   
        JFrame.setDefaultLookAndFeelDecorated(true);
        new ServerForm();
        }
        private void startServer() {
   
                try {
   
                        ServerSocket server=new ServerSocket(PORT)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值