点关注,不迷路;持续更新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()
服务器向客户端发的消息格式设计:
命令关键字@#发送方@#消息内容
登录:
- msg @#server @# 用户[userName]登录了 (给客户端显示用的)
- cmdAdd@#server @# userName (给客户端维护在线用户列表用的)
退出: - msg @#server @# 用户[userName]退出了 (给客户端显示用的)
- 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)