
关于java网络的问题,求java高手帮帮忙啊!在线等待!!!
下面是我做的一个聊天程序的服务器部分,刚写完用户登录的那部分代码,但为什么我点击启动服务器后就卡了?求高手帮帮忙!!!publicclassServer{JTextFie...
下面是我做的一个聊天程序的服务器部分,刚写完用户登录的那部分代码,但为什么我点击启动服务器后就卡了?求高手帮帮忙!!!
public class Server
{
JTextField textField;
JButton button;
JTextArea textArea;
JLabel label;
public void serverUi()
{
JFrame frame = new JFrame("服务器");
frame.setSize(300,200);
frame.setLayout(new GridLayout(3, 1));
JPanel panel1 = new JPanel(new GridLayout(1, 2));
JPanel panel2 = new JPanel(new GridLayout(1, 3));
JPanel panel3 = new JPanel(new GridLayout(1, 1));
panel1.add(new JLabel("服务器状态:"));
label = new JLabel("关闭");
panel1.add(label);
panel2.add(new JLabel("端口号:"));
textField = new JTextField();
panel2.add(textField);
button = new JButton("启动服务器");
panel2.add(button);
textArea = new JTextArea();
panel3.add(textArea);
frame.add(panel1);
frame.add(panel2);
frame.add(panel3);
button.addActionListener(new ServerListener());
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(String[] args)
{
Server server = new Server();
server.serverUi();
}
Server server = this;
class ServerListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
server.label.setText("已开启");
TreeMap<String, DatagramPacket> map = new TreeMap<String, DatagramPacket>();
//监听用户登录
while(true)
{
try
{
DatagramSocket socket = new DatagramSocket(Integer.parseInt(server.textField.getText()));
byte[] buffer = new byte[200];//保存用户的名字
DatagramPacket packet1 = new DatagramPacket(buffer, 20);
socket.receive(packet1);
//将用户的信息保存到TreeMap中
map.put(new String(buffer, 0, packet1.getLength()), packet1);
//遍历map对象的Key
Set set = map.keySet();
for(Object obj : set)
{
String name = (String)obj;
//将登录的用户显示到服务器的已登录用户列表
server.textArea.setText("");
server.textArea.setText(server.textArea.getText() + "\n" + name);
}
//遍历Map对象的value
Collection coll = map.values();
for(Object obj : coll)
{
DatagramPacket oldPacket = (DatagramPacket)obj;
byte[] names = server.textArea.getText().getBytes();//所有登录用户的名字的字节形式
DatagramPacket newPacketNew = new DatagramPacket(names, names.length
, oldPacket.getAddress(), oldPacket.getPort());
//将已登录用户名字的列表发送到已登录的用户
socket.send(newPacketNew);
}
}
catch (Exception e1)
{
e1.printStackTrace();
}
}
}
}
}
用户登录时会将用户名用过数据报包传到服务器 展开
public class Server
{
JTextField textField;
JButton button;
JTextArea textArea;
JLabel label;
public void serverUi()
{
JFrame frame = new JFrame("服务器");
frame.setSize(300,200);
frame.setLayout(new GridLayout(3, 1));
JPanel panel1 = new JPanel(new GridLayout(1, 2));
JPanel panel2 = new JPanel(new GridLayout(1, 3));
JPanel panel3 = new JPanel(new GridLayout(1, 1));
panel1.add(new JLabel("服务器状态:"));
label = new JLabel("关闭");
panel1.add(label);
panel2.add(new JLabel("端口号:"));
textField = new JTextField();
panel2.add(textField);
button = new JButton("启动服务器");
panel2.add(button);
textArea = new JTextArea();
panel3.add(textArea);
frame.add(panel1);
frame.add(panel2);
frame.add(panel3);
button.addActionListener(new ServerListener());
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(String[] args)
{
Server server = new Server();
server.serverUi();
}
Server server = this;
class ServerListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
server.label.setText("已开启");
TreeMap<String, DatagramPacket> map = new TreeMap<String, DatagramPacket>();
//监听用户登录
while(true)
{
try
{
DatagramSocket socket = new DatagramSocket(Integer.parseInt(server.textField.getText()));
byte[] buffer = new byte[200];//保存用户的名字
DatagramPacket packet1 = new DatagramPacket(buffer, 20);
socket.receive(packet1);
//将用户的信息保存到TreeMap中
map.put(new String(buffer, 0, packet1.getLength()), packet1);
//遍历map对象的Key
Set set = map.keySet();
for(Object obj : set)
{
String name = (String)obj;
//将登录的用户显示到服务器的已登录用户列表
server.textArea.setText("");
server.textArea.setText(server.textArea.getText() + "\n" + name);
}
//遍历Map对象的value
Collection coll = map.values();
for(Object obj : coll)
{
DatagramPacket oldPacket = (DatagramPacket)obj;
byte[] names = server.textArea.getText().getBytes();//所有登录用户的名字的字节形式
DatagramPacket newPacketNew = new DatagramPacket(names, names.length
, oldPacket.getAddress(), oldPacket.getPort());
//将已登录用户名字的列表发送到已登录的用户
socket.send(newPacketNew);
}
}
catch (Exception e1)
{
e1.printStackTrace();
}
}
}
}
}
用户登录时会将用户名用过数据报包传到服务器 展开
1个回答
展开全部
服务器与客户端交互的部分请用多线程,单线程的while循环必然导致服务器卡住
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询