问题如下:我想弄个类似登陆界面的东西,可以创建服务器,也可输入IP地址做客户端。里面写入两个方法,单击创建火登陆,调用creatsocket()或clientsocket()方法。方法内,分别创建SOCKET和SERVERSOCKET,并且建立输入输出流。然后创建QQFRAME()的对象。问题就出在这里,当运行时单击按钮,会出现QQFRAME的对象,但是只是一个外框,里面的按钮和文本区都不显示,连关闭窗口都不响应。但是,问题貌似不出在QQFRAME类,因为我直接调用那个类正常,但是只要在方法中加入创建SOCKET和输入输出流的时候,就出这个毛病。一下是登陆的代码。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class land extends JFrame implements ActionListener{    private JButton Jland,JCreater;
    private JTextField text;
    private ServerSocket server;
    private Socket client;
    public land() {
super("登陆");
        this.setLocation(400,340);               //框架显示在屏幕的位置
        this.setLayout(new FlowLayout());        //框架流布局,居中
        
        this.add(new JLabel("  ID"));           //创建标签,添加到框架上 
        text=new JTextField("",14);
        this.add(text);     //创建文本行
        Jland=new JButton("登陆");
        JCreater=new JButton("创建");
        Jland.addActionListener(this);
        JCreater.addActionListener(this);
        this.add(Jland);
        this.add(JCreater);
        this.pack();
        this.setVisible(true);                   //显示框架

    }    /**
     * @param args
     */
    public static void main(String[] args) {
// TODO Auto-generated method stub
new land();
    }
    private void creatsocket()
    {
try {
    server=new ServerSocket(5000);
    client=server.accept();
    this.setVisible(false);
    BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));
    PrintWriter cout = new PrintWriter(client.getOutputStream(), true);
    qqframe chat=new qqframe("服务器");
    chat.setWriter(cout);
    String str="";
    do
    {
str=cin.readLine();
chat.receive(str);
    }
    while(true);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
};

    }
    private void clientsocket()
    {
try {
    client=new Socket(InetAddress.getByName(text.getText()),5000);
    qqframe chat=new qqframe("客户端");
    BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));
    PrintWriter cout = new PrintWriter(client.getOutputStream(), true);
    chat.setWriter(cout);
    String str="";
    do
    {
str=cin.readLine();
chat.receive(str);
    }
    while(true);
} catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
    }    public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand()=="创建")
{
    this.creatsocket();
}
else
{
    this.clientsocket();
}
    }}

解决方案 »

  1.   

    顺便再问一下,ECLIPSE自动给填写的那些注释都是干什么的?
      

  2.   

    你这个问题是老问题了,新手经常犯的问题,csdn里面关于socket编程的问题可能有一半就是你这样的问题你看你自己的程序:
        server=new ServerSocket(5000); 
        client=server.accept(); 这个accept方法是一直等待到有消息发送过来才向下运行,也就是说,这里占用了你的cpu资源不释放了    do 
        { 
    str=cin.readLine(); 
    chat.receive(str); 
        } 
        while(true); 这些就更厉害了,没收到消息你就啥都别干,这样你让主线程怎么把你的gui画出来??
    用常规的解决办法,把这些占资源的东西统统放到一个线程去,这样,你的服务器得单独一个线程,客户端也得独立一个线程
      

  3.   

    高深问题高手回答了至于
    顺便再问一下,ECLIPSE自动给填写的那些注释都是干什么的?这些不是干嘛的,有些自动生成的代码,肯定带着一些注释