import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class Draw extends JFrame {
/*
* Socket stuff
*/
static String host;
static int port;
static int localport;
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
public Draw(int localport, String host, int port) {
d = this;
this.localport = localport;
this.host = host;
this.port = port;
try {
ds = new DatagramSocket(localport);
InetAddress ia = InetAddress.getByName(host);
System.out.println("Attempting to connect DatagramSocket. Local port "
+ localport + " , foreign host " + host + ", foreign port " + port + "...");
ds.connect(ia, port);
System.out.println("Success, ds.localport: " + ds.getLocalPort()
+ ", ds.port: " + ds.getPort() + ", address: " + ds.getInetAddress());
Reciever r = new Reciever(ds);
r.start();
} catch (Exception e) {
e.printStackTrace();
}
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(p, BorderLayout.CENTER);
setSize(640, 480);
setVisible(true);
}
public static void main(String[] args) {
int x = 0;
for (String s : args){
if (x==0){
localport = Integer.parseInt(s);
x++;
}
else if (x==1){
host = s;
x++;
}
else if (x==2){
port = Integer.parseInt(s);
}
}
Draw d = new Draw(localport, host, port);
}
}
class Paper extends JPanel {
DatagramSocket ds;
private HashSet hs = new HashSet();
public Paper(DatagramSocket ds) {
this.ds=ds;
setBackground(Color.white);
addMouseListener(new L1(ds));
addMouseMotionListener(new L2());
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
Iterator i = hs.iterator();
while(i.hasNext()) {
Point p = (Point)i.next();
g.fillOval(p.x, p.y, 2, 2);
}
}
private void addPoint(Point p) {
hs.add(p);
repaint();
}
class L1 extends MouseAdapter {
DatagramSocket ds;
public L1(DatagramSocket ds){
this.ds=ds;
}
public void mousePressed(MouseEvent me) {
addPoint(me.getPoint());
Point p = me.getPoint();
String message = Integer.toString(p.x) + " " + Integer.toString(p.y);
System.out.println(message);
try{
byte[] data = message.getBytes("UTF-8");
//InetAddress ia = InetAddress.getByName(ds.host);
String convertedMessage = new String(data, "UTF-8");
System.out.println("The converted string is " + convertedMessage);
DatagramPacket dp = new DatagramPacket(data, data.length);
System.out.println(ds.getPort());
//System.out.println(message);
//System.out.println(ds.toString());
//ds.send(dp);
/*System.out.println("2Sending a packet containing data: " +data +" to "
+ ia + ":" + d.port + "...");*/
} catch (Exception e){
e.printStackTrace();
}
}
}
class L2 extends MouseMotionAdapter {
public void mouseDragged(MouseEvent me) {
addPoint(me.getPoint());
Point p = me.getPoint();
String message = Integer.toString(p.x) + " " + Integer.toString(p.y);
//System.out.println(message);
}
}
}
class Reciever extends Thread{
DatagramSocket ds;
byte[] buffer;
Reciever(DatagramSocket ds){
this.ds = ds;
buffer = new byte[65507];
}
public void run(){
try {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while(true){
try {
ds.receive(packet);
String s = new String(packet.getData());
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Répondre
Eh bien, vous avez présenté tout à fait un gâchis de code là, mais vous avez ce:
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
La valeur par défaut pour les champs de type de référence est nulle, de sorte que vous appelez efficacement
new Paper(null)
qui mettra fin ensuite appeler
new L1(null)
qui est pourquoi appeler ds.getPort()
dans L1 lève une exception.
Notez que la valeur de la variable est passée dans chaque cas - il est pas comme le ds
au sein de L1 est associée au champ ds
dans la classe Draw
. Sans trop regarder dans les détails, il est difficile de suggérer une solution facile, mais il est probable que vous deviez attendre d'avoir créé le DatagramSocket
avant de créer le Paper
.
Vous faites ceci:
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
Ici, ds est non initialisée, donc nulle. Le papier le transmet à L1, ainsi le ds dans L1 est également nul.
Lorsque vous déclarez Paper p = new Paper(ds);
, il initialise le papier avec un DatagramSocket null.
Je pense que ce que vous voulez faire est de changer cette ligne à Paper p;
puis à droite après ds = new DatagramSocket(localport);
ajouter p = new Paper(ds);
Juste un heads-up au cas où vous vous poseriez la question, une idée fausse très répandue en Java est que: si vous attribuez new Paper(ds);
et vous plus tard change ds (aucune de ses variables d'instance, vous changez la totalité de ds comme: ds = new quelque chose), la manipulation de référence en Java ne signifie pas que l'instance de ds initialement utilisée dans le papier est modifiée.