这是我做的一个游戏里面 网络连接部分的代码,我把它截取出来,另外做了个测试窗口,大家给我看看吧。
问题描述
1、出现网络连接对话框后,选择将本机作为客户机,输入目标IP,点击确认后,对话框能够关闭,并且在文本框中显示相应信息,用网络连接检测工具检测,程序已经连接网络,正在等待接收服务机信息
2、出现网络连接对话框后,选择将本机做服务机,点击确认,对话框不能关闭,文本框中也没有相应信息显示,就像是程序死机一样,用网络连接检测工具检测,程序也在占用连接。我希望达到的目的:
1、如果是客户机时,输入IP,点击确认后,会将相应信息发送到服务机,随即等待服务机答复。
2、如果是服务机,勿需输入IP,点击确认,会接收客户机传来的数据包,得到客户机的IP地址,然后发送一个答复给客户机另外,图像传输那部分的代码不知道有没有BUG,也烦请各位高手给看一下补充说明,各位调试时请运行两个DOS窗口(我是用DOS调试的),开启两份程序
  import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
public class testnetlink extends JFrame implements ActionListener
{
  JButton button;
  static JTextArea linkmessagetextarea;
  testnetlink()
  {
    super("网络连接测试窗口"); 
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
Container con=getContentPane();
con.setLayout(null);
    button=new JButton("网络连接");
button.addActionListener(this);
linkmessagetextarea=new JTextArea(10,30);
button.setBounds(100,30,100,30);
    linkmessagetextarea.setBounds(60,70,180,80);
con.add(button);
con.add(linkmessagetextarea);
setSize(300,200);
setVisible(true);
  }
  public void actionPerformed(ActionEvent e)
  {
    if(e.getSource()==button)
new createdialog();  }  public static void main(String args[]) 
  {
    new testnetlink();
  }}
class createdialog extends JDialog implements ActionListener,ItemListener
  {
   JButton dialogbutton,linkbutton;
   JTextField IPtextfield;
   JRadioButton serverbutton,clientbutton;
   static int computer=1;
   public createdialog(String message)
   {
     super(jframe.frame,"请求连接提醒!");
     setSize(300,200);
     Container con=getContentPane();
     con.setLayout(null);
 con.setForeground(new Color(220,200,240));
 JLabel linklabel=new JLabel(message);
 linkbutton=new JButton("确认");
     linkbutton.addActionListener(this);
 con.add(linklabel);
 con.add(linkbutton);
 linklabel.setBounds(10,50,280,30);
 linkbutton.setBounds(120,120,60,30);
 setResizable(false);
 setVisible(true);
   }
  
   public createdialog()
   {
 super(jframe.frame,"建立网络连接");
 setSize(300,200);
     Container con=getContentPane();
 con.setLayout(null);
 con.setForeground(new Color(220,200,240));
 ButtonGroup buttongroup=new ButtonGroup();
 serverbutton=new JRadioButton("将本机作服务机",false);
 serverbutton.addItemListener(this);
 clientbutton=new JRadioButton("将本机作客户机",true);
 clientbutton.addItemListener(this);
 JLabel dialoglabel=new JLabel("请输入服务机地址:");
 IPtextfield=new JTextField(15);
 dialogbutton=new JButton("确定");
 dialogbutton.addActionListener(this);
 dialogbutton.setBackground(new Color(201,218,233));
 buttongroup.add(serverbutton);
 buttongroup.add(clientbutton);
     con.add(serverbutton);
 con.add(clientbutton);
 con.add(dialoglabel);
 con.add(IPtextfield);
 con.add(dialogbutton);
 serverbutton.setBounds(25,5,250,30);
     clientbutton.setBounds(25,45,250,30);
 dialoglabel.setBounds(20,85,125,30);
 IPtextfield.setBounds(150,85,130,30);
 dialogbutton.setBounds(120,125,60,30); 
 setResizable(false);
 setVisible(true);
   }
   public void itemStateChanged(ItemEvent e)
   {
     if(e.getItemSelectable()==serverbutton){
 this.computer=0;//表示将本机做服务器
     IPtextfield.setEditable(false);
 }
 else if(e.getItemSelectable()==clientbutton){
 this.computer=1;//表示将本机做客户机
     IPtextfield.setEditable(true);
 }
   }
   public void actionPerformed(ActionEvent e)
   {
      if(e.getSource()==linkbutton)
    jframe.linkmessagetextarea.setText("已经连接,可以进行游戏了!"+"\n");
  else if(e.getSource()==dialogbutton){
   if(this.computer==1){
try{ 
new imagecapture().getIP(InetAddress.getByName(IPtextfield.getText()),1);
}catch(UnknownHostException E){}
this.dispose(); 
   }
  else if(this.computer==0){
new imagecapture().receivemessage(0);
this.dispose();
   }
 }
    }
   }
/*图像采集发送线程*/
class imagecapture extends Thread
{
  BufferedImage image;
  Rectangle rec;
  Dimension dimension;
  DatagramPacket datapack;
  Point p;
  DatagramSocket senddatapack;
  ByteArrayOutputStream capturestream;
  Robot robot; 
  static InetAddress address;
  static byte imagedata[];
  /*取得IP地址*/
  public void getIP(InetAddress address,int computer)
  {
this.address=address;//服务机IP地址
if(computer==1){
  sendmessage("请求建立网络连接,请点击确认!");
  receivemessage(1);
}
else if(computer==0)
  sendmessage("网络连接已经建立,可以进行游戏了!");
  }
  /*将本机地址发送到服务机以建立网络连接*/
  public void sendmessage(String message)
  {
    byte messagedata[]=new byte[8192];
try{
messagedata=message.getBytes();
datapack=new DatagramPacket(messagedata,messagedata.length,address,1988);
senddatapack=new DatagramSocket(1988);
senddatapack.send(datapack);
}catch(Exception e){}
testnetlink.linkmessagetextarea.append(address.toString()+"\n");//调试信息
  }
   /*接收IP地址*/
  public void receivemessage(int computer)
  { 
 byte IPdata[]=new byte[8192];
 DatagramPacket messagepack=null;
 DatagramSocket receivemessagepack=null;
 InetAddress address=null;
 String message=null;
     testnetlink.linkmessagetextarea.append("这是调试信息!"+"\n");//调试信息
 try{
   messagepack=new DatagramPacket(IPdata,IPdata.length);
   receivemessagepack=new DatagramSocket(1988);
 }catch(Exception e){}  try{
testnetlink.linkmessagetextarea.append("这是调试信息!"+"\n");//调试信息
receivemessagepack.receive(messagepack);
address=messagepack.getAddress();
message=new String(messagepack.getData(),0,IPdata.length);
testnetlink.linkmessagetextarea.append("这是调试信息"+address.toString()+"\n");//调试信息
   }catch(Exception e){}
 if(computer==0){
 getIP(address,computer);
     new createdialog(message);
 }
 else if(computer==1)
 testnetlink.linkmessagetextarea.append(message);
  }
  public void run()
  {
try{
robot=new Robot();
}catch(AWTException e){}
dimension=new Dimension(300,500);
capturestream=new ByteArrayOutputStream();
while(gamecontrol.gamestate!=0)
{
    p=jframe.gamecanvas1.getLocationOnScreen();
    p=new Point(p.x+1,p.y+1);
rec=new Rectangle(p,dimension);
  try{
    image=robot.createScreenCapture(rec);
    ImageIO.write(image,"gif",capturestream);
imagedata=capturestream.toByteArray();
    datapack=new DatagramPacket(imagedata,imagedata.length,address,1988);
        senddatapack=new DatagramSocket(1988);
        senddatapack.send(datapack);
 }catch(Exception e){}
 try{
 sleep(gamecontrol.time);
 }catch(InterruptedException e){}
 }
  }
}/*图像接收显示线程*/
class imageshow extends Thread
{
  JPanel imagepanel=new JPanel();
  byte showdata[]=new byte[81920];
  DatagramPacket pack;
  DatagramSocket receivepack;
  ByteArrayOutputStream showstream=new ByteArrayOutputStream();
  Toolkit tool=jframe.frame.getToolkit();
  static Image image=null;
  public void imagepanel()
  {  
  jframe.frame.setSize(860,580);
  jframe.mymenubar.setBounds(0,0,853,20);
  jframe.frame.add(imagepanel);
      imagepanel.setBounds(538,35,303,502);
      imagepanel.setBackground(Color.white);
  imagepanel.setBorder(BorderFactory.createEtchedBorder(Color.white,Color.lightGray));
  }
  
   public void run()
   {
 while(gamecontrol.gamestate!=0)
 {
   showdata=null;
       try{
     pack=new DatagramPacket(showdata,showdata.length);
         receivepack=new DatagramSocket(1988);
     receivepack.receive(pack);
         image=tool.createImage(pack.getData());
 //showstream.write(pack.getData(),0,pack.length);
         //showdata=showstream.toByteArray(); 
 //image=tool.createImage(showdata); 
 imagepanel.repaint();
  }catch(Exception e){}
 }
   }
   public void paint(Graphics g)
{
  if(image!=null)
  g.drawImage(image,1,1,imagepanel);
}}

解决方案 »

  1.   

    不太懂swing.  帮LZ顶下吧
      

  2.   

    swing 略懂但没有能力看出问题帮你顶。。别沉了。。
      

  3.   

    我是楼主
    问题解决了,原来是我粗心造成的!因为我在本机上开启了两个程序调试,程序里定义的端口号不应该一样,我改了端口号,就能在本地机上运行了,否则,本地机上开一个程序,另一台机器开个程序也能运行。另外问个问题,我想在一个JPanel对象上绘图,图像数据是网络传输过来的,要用Toolkit中的createImage(byte[] imagedata)这个方法创建一副图像,问:怎么得到一个Toolkit实例?  Toolkit tool=jframe.frame.getToolkit()这样对吗?
    大家可以看以下代码。
    class imageshow extends Thread
    {
      JPanel imagepanel=new JPanel();//请看这里,我在本类中创建的JPanel实例,然后把它加到了JFrame中,frame是在另一个类中创建的
      byte showdata[]=new byte[81920];
      DatagramPacket pack;
      DatagramSocket receivepack;
      ByteArrayOutputStream showstream=new ByteArrayOutputStream();
      Toolkit tool=jframe.frame.getToolkit();//请看这里,jframe是我的窗口类,frame是JFrame对象,这样获取Toolkit有问题否?我编译能过也能运行,但是JPanel上没有显示图像,发送图像数据的线程我能确定没有错误
      static Image image=null;
      public void imagepanel()
      {  
          jframe.frame.setSize(860,580);
          jframe.mymenubar.setBounds(0,0,853,20);
          jframe.frame.add(imagepanel);
          imagepanel.setBounds(538,35,303,502);
          imagepanel.setBackground(Color.white);
          imagepanel.setBorder(BorderFactory.createEtchedBorder(Color.white,Color.lightGray));
      }
      
       public void run()
       {
         while(gamecontrol.gamestate!=0)
         {
           showdata=null;
           try{
             pack=new DatagramPacket(showdata,showdata.length);
             receivepack=new DatagramSocket(1988);
             receivepack.receive(pack);
             image=tool.createImage(pack.getData());//请看这里,这句代码是否有问题?
             //showstream.write(pack.getData(),0,pack.length);
             //showdata=showstream.toByteArray(); 
             //image=tool.createImage(showdata); 
             imagepanel.repaint();
              }catch(Exception e){}
         }
       }
       public void paint(Graphics g)
        {
          if(image!=null)
              g.drawImage(image,1,1,imagepanel);
        }
    谢谢大家捧场,谁给我解决了,这100分都送他