问题如下:我想弄个类似登陆界面的东西,可以创建服务器,也可输入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();
}
}}
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();
}
}}
解决方案 »
- 在线等待 Spring + Hiberate 表不存在问题?
- 寻求答案1
- 高手进
- java怎样从SQL Server数据库的image字段读取然后下载成文件?
- 【放50分】有关网络上server/client间互相通讯的关系滴问题
- 这个问题够经典~~~~~~~~~~~
- Thread.currentThread().sleep(5000)跟Thread.sleep(5000)有什么不同呢?
- 关于Io流的close的问题
- 急:请教一个Properties类的用法
- 哪里有thinking in java (编程思想)中文电子版下载?
- 求救这个多线程程序。是不是这里没有多线程的高手???
- 如果p是Parent父类对象,而c是子类Child对象。那么p=3,这种写法正确吗??
server=new ServerSocket(5000);
client=server.accept(); 这个accept方法是一直等待到有消息发送过来才向下运行,也就是说,这里占用了你的cpu资源不释放了 do
{
str=cin.readLine();
chat.receive(str);
}
while(true); 这些就更厉害了,没收到消息你就啥都别干,这样你让主线程怎么把你的gui画出来??
用常规的解决办法,把这些占资源的东西统统放到一个线程去,这样,你的服务器得单独一个线程,客户端也得独立一个线程
顺便再问一下,ECLIPSE自动给填写的那些注释都是干什么的?这些不是干嘛的,有些自动生成的代码,肯定带着一些注释