初学java,写的一个C/S网络聊天程序,在客户端出现了一些问题,代码如下:
package MultiChat.chatClient;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class chatClient {
JFrame frame = new JFrame("chat");
//JPanel panel1 = new JPanel();
//JPanel panel2 = new JPanel();

JTextField user = new JTextField(30);
JButton link = new JButton("link");
JButton disconnect = new JButton("disconnect");
JTextArea showMsg = new JTextArea(30, 30);
JTextField writeMsg = new JTextField(30);
JButton sendMsg = new JButton("send");
private static final int PORT = 30000;
Socket socket;
BufferedReader br;
PrintStream ps;
boolean tip;
//String userName = "";
public void init()
{
JPanel panel21 = new JPanel();
JPanel panel22 = new JPanel();
JPanel panel23 = new JPanel();

//user.setEditable(false);
panel21.add(user);
panel21.add(link);
panel21.add(disconnect);

showMsg.setEditable(false);
panel22.add(showMsg);

panel23.add(writeMsg);
panel23.add(sendMsg);

frame.add(panel21, BorderLayout.NORTH);
frame.add(panel22, BorderLayout.CENTER);
frame.add(panel23, BorderLayout.SOUTH);

frame.pack();
frame.setVisible(true);
}

public void chat()
{
link.addActionListener(new linkActionListener());
disconnect.addActionListener(new disconnectActionListener());
sendMsg.addActionListener(new sendActionListener());
}
class linkActionListener implements ActionListener
{ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
socket = new Socket("127.0.0.1", PORT);
ps = new PrintStream(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
tip = true;
while(tip)
{
String userName = user.getText();
ps.println(chatProtocol.USER_ROUND + userName + chatProtocol.USER_ROUND);
//接受服务器的消息
String result = br.readLine();
if(result.equals(chatProtocol.NAME_REP))
{
System.out.println("名字重复,请重新输入");
continue;
}
if(result.equals(chatProtocol.LOGIN_SUCESS))
{
System.out.println("successfull");
user.setEditable(false);
user.setText(userName);
tip = false;
//break;
}
}

} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
new clientThread(br).start();
}
}
class disconnectActionListener implements ActionListener
{ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(socket != null)
{
try {
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
class sendActionListener implements ActionListener
{ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String msg = sendMsg.getText();
while(msg != null)
{
if(msg.startsWith("//") && msg.indexOf(":") > 0)
{
msg = msg.substring(2);
ps.println(chatProtocol.PRIVATE_ROUND 
+ msg.split(":")[0] + chatProtocol.SPLIT_SIGN
+ msg.split(":")[1] + chatProtocol.PRIVATE_ROUND);
}
else
{
ps.println(chatProtocol.MSG_ROUND + msg + chatProtocol.MSG_ROUND);
}
}
}

}
class clientThread extends Thread
{
BufferedReader br = null;
public clientThread(BufferedReader br)
{
this.br = br;
}
public void run()
{
String line = null;
try {
while((line = br.readLine()) != null)
{
showMsg.append(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
chatClient client = new chatClient();
client.init();
client.chat();
}
}初学的问题是:运行客户端,只要一点击link,就会卡死,请高手解答,谢谢!!!

解决方案 »

  1.   

    这个代码排列可能看起来有点恼火,我重新把代码发上来package MultiChat.chatClient;import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.net.UnknownHostException;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;public class chatClient {
    JFrame frame = new JFrame("chat");
    JTextField user = new JTextField(30);
    JButton link = new JButton("link");
    JButton disconnect = new JButton("disconnect");
    JTextArea showMsg = new JTextArea(30, 30);
    JTextField writeMsg = new JTextField(30);
    JButton sendMsg = new JButton("send");
    private static final int PORT = 30000;
    Socket socket;
    BufferedReader br;
    PrintStream ps;
    boolean tip;
    public void init()
    {
    JPanel panel21 = new JPanel();
    JPanel panel22 = new JPanel();
    JPanel panel23 = new JPanel();

    panel21.add(user);
    panel21.add(link);
    panel21.add(disconnect);

    showMsg.setEditable(false);
    panel22.add(showMsg);

    panel23.add(writeMsg);
    panel23.add(sendMsg);

    frame.add(panel21, BorderLayout.NORTH);
    frame.add(panel22, BorderLayout.CENTER);
    frame.add(panel23, BorderLayout.SOUTH);

    frame.pack();
    frame.setVisible(true);
    }

    public void chat()
    {
    link.addActionListener(new linkActionListener());
    disconnect.addActionListener(new disconnectActionListener());
    sendMsg.addActionListener(new sendActionListener());
    }
    class linkActionListener implements ActionListener
    { @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    try {
    socket = new Socket("127.0.0.1", PORT);
    ps = new PrintStream(socket.getOutputStream());
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    tip = true;
    while(tip)
    {
    String userName = user.getText();
    ps.println(chatProtocol.USER_ROUND + userName + chatProtocol.USER_ROUND);
    //接受服务器的消息
    String result = br.readLine();
    if(result.equals(chatProtocol.NAME_REP))
    {
    System.out.println("名字重复,请重新输入");
    continue;
    }
    if(result.equals(chatProtocol.LOGIN_SUCESS))
    {
    System.out.println("successfull");
    user.setEditable(false);
    user.setText(userName);
    tip = false;
    //break;
    }
    }

    } catch (UnknownHostException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    new clientThread(br).start();
    }
    }
    class disconnectActionListener implements ActionListener
    { @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(socket != null)
    {
    try {
    socket.close();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
    }
    }
    class sendActionListener implements ActionListener
    { @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    String msg = sendMsg.getText();
    while(msg != null)
    {
    if(msg.startsWith("//") && msg.indexOf(":") > 0)
    {
    msg = msg.substring(2);
    ps.println(chatProtocol.PRIVATE_ROUND 
    + msg.split(":")[0] + chatProtocol.SPLIT_SIGN
    + msg.split(":")[1] + chatProtocol.PRIVATE_ROUND);
    }
    else
    {
    ps.println(chatProtocol.MSG_ROUND + msg + chatProtocol.MSG_ROUND);
    }
    }
    }

    }
    class clientThread extends Thread
    {
    BufferedReader br = null;
    public clientThread(BufferedReader br)
    {
    this.br = br;
    }
    public void run()
    {
    String line = null;
    try {
    while((line = br.readLine()) != null)
    {
    showMsg.append(line);
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    public static void main(String[] args)
    {
    chatClient client = new chatClient();
    client.init();
    client.chat();
    }
    }
      

  2.   

    代码如下,请高手指导:package MultiChat.chatClient;import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.net.UnknownHostException;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;public class chatClient {
    JFrame frame = new JFrame("chat");
    //JPanel panel1 = new JPanel();
    //JPanel panel2 = new JPanel();

    JTextField user = new JTextField(30);
    JButton link = new JButton("link");
    JButton disconnect = new JButton("disconnect");
    JTextArea showMsg = new JTextArea(30, 30);
    JTextField writeMsg = new JTextField(30);
    JButton sendMsg = new JButton("send");
    private static final int PORT = 30000;
    Socket socket;
    BufferedReader br;
    PrintStream ps;
    boolean tip;
    //String userName = "";
    public void init()
    {
    JPanel panel21 = new JPanel();
    JPanel panel22 = new JPanel();
    JPanel panel23 = new JPanel();

    //user.setEditable(false);
    panel21.add(user);
    panel21.add(link);
    panel21.add(disconnect);

    showMsg.setEditable(false);
    panel22.add(showMsg);

    panel23.add(writeMsg);
    panel23.add(sendMsg);

    frame.add(panel21, BorderLayout.NORTH);
    frame.add(panel22, BorderLayout.CENTER);
    frame.add(panel23, BorderLayout.SOUTH);

    frame.pack();
    frame.setVisible(true);
    }

    public void chat()
    {
    link.addActionListener(new linkActionListener());
    disconnect.addActionListener(new disconnectActionListener());
    sendMsg.addActionListener(new sendActionListener());
    }
    class linkActionListener implements ActionListener
    { @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    try {
    socket = new Socket("127.0.0.1", PORT);
    ps = new PrintStream(socket.getOutputStream());
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    tip = true;
    while(tip)
    {
    String userName = user.getText();
    ps.println(chatProtocol.USER_ROUND + userName + chatProtocol.USER_ROUND);
    //接受服务器的消息
    String result = br.readLine();
    if(result.equals(chatProtocol.NAME_REP))
    {
    System.out.println("名字重复,请重新输入");
    continue;
    }
    if(result.equals(chatProtocol.LOGIN_SUCESS))
    {
    System.out.println("successfull");
    user.setEditable(false);
    user.setText(userName);
    tip = false;
    //break;
    }
    }

    } catch (UnknownHostException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    new clientThread(br).start();
    }
    }
    class disconnectActionListener implements ActionListener
    { @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(socket != null)
    {
    try {
    socket.close();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
    }
    }
    class sendActionListener implements ActionListener
    { @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    String msg = sendMsg.getText();
    while(msg != null)
    {
    if(msg.startsWith("//") && msg.indexOf(":") > 0)
    {
    msg = msg.substring(2);
    ps.println(chatProtocol.PRIVATE_ROUND 
    + msg.split(":")[0] + chatProtocol.SPLIT_SIGN
    + msg.split(":")[1] + chatProtocol.PRIVATE_ROUND);
    }
    else
    {
    ps.println(chatProtocol.MSG_ROUND + msg + chatProtocol.MSG_ROUND);
    }
    }
    }

    }
    class clientThread extends Thread
    {
    BufferedReader br = null;
    public clientThread(BufferedReader br)
    {
    this.br = br;
    }
    public void run()
    {
    String line = null;
    try {
    while((line = br.readLine()) != null)
    {
    showMsg.append(line);
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    public static void main(String[] args)
    {
    chatClient client = new chatClient();
    client.init();
    client.chat();
    }
    }
      

  3.   

    整个帖子都很恼火。没有问题!
    建议看http://topic.csdn.net/u/20120530/03/4237da30-3bfd-435e-b9b7-201054a9f3c7.html?72809
      

  4.   

    java Scoket的c\s结构聊天室http://www.happyalaric.com/archives/270 你看看这个