这是我做的一个游戏里面 网络连接部分的代码,我把它截取出来,另外做了个测试窗口,大家给我看看吧。
问题描述
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、出现网络连接对话框后,选择将本机作为客户机,输入目标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);
}}
解决方案 »
- java was started but returned exit code=1
- FileInputStream.read()
- 我用字符流读二进制文件....我知道应该用字节流.但是我觉得字符读小文件应该也可以可是失败了为什么
- eclipse rcp中如何从一个view中取得另外一个view的实例?
- 一个基础概念问题
- LINUX 的仁兄 应该没什么问题的
- *求最好方法*循环读取每行数据,判断第一个字符是否数字分别写入不同文本
- 为什么 8362.97*100.00=836296.9999999999 ?
- java中有没有得到一个数的立方根的函数啊?
- java怎用解开rar文件??
- 关于JPanel中的paint问题
- java连接Sql Server2005数据库,出现NullPointerException异常?
问题解决了,原来是我粗心造成的!因为我在本机上开启了两个程序调试,程序里定义的端口号不应该一样,我改了端口号,就能在本地机上运行了,否则,本地机上开一个程序,另一台机器开个程序也能运行。另外问个问题,我想在一个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分都送他