サーバ側送信UDPパケットクライアントが問題解決を受け取っていない
最近馬兵士先生に従って戦車大戦のネット版の編纂を学んで、昨夜の編纂の過程の中で問題に出会って、コードは以下のようにして、サーバー側はクライアントからの戦車の情報を受信してそしてすべての戦車に転送する時、クライアントはUDPのニュースを受け取っていません.
1,クライアントのudpパケットを受信するスレッドが起動していないことを考慮しますか?そこで、オンラインクラスUDPRecvThreadのrunメソッドにおけるSystem.out.println(「something」)は、プログラムを実行し、出力があり、スレッドが起動したことを示します.
2、初めてdebugを使ってみます.通常、プログラムは「a packet received from server」を出力すべきです.今は出力されていません.出力文の前のdsにブレークポイントを設定することを考えています.receive(dp)、debugを実行し、プログラムがreceiveに実行されてからStep over、プログラムが直接終了し、サーバ側がudpパケットを送信したかどうかを考慮する
3,サーバ側がudpパケットを送信かどうかはds.send(dp)の後に1つの“a packet sended”を出力して、そしてこのパケットを解析して、実行プログラムは出力文があることを発見して、解析のパケットも間違いがなくて、クライアントの戦車のパケットが成功してしかもパケットに問題がなくて、サーバーの端も成功を受信して、間違いの一環はサーバーが各クライアントに送信することを説明して、
4,ArrayListにクライアントタンクが入っているかどうかを確認し、チェックしても問題ありません
5,馬先生のソースコードと逐行比較することができなくて、コードを比較しても問題を発見していません
以上が昨夜の大まかな考え方で、もう1時になったので、洗い砕きました.
目を閉じて眠れなくて、考えを整理して、更に考えて、問題はサービス側がクライアントに送る過程で、クライアントは受け取っていないで、サービス側の送信アドレスが正しいかどうか、これ以上考えていないで、サービス側はudpパケットを送信する前にudpパケットに対してIPとポートを再設定して、戦車のIPとポートを取って、間違いないべきで、では、戦車が自分のIPとポートをサービス側に送るときに間違いはありませんか?明日検査しましょう.
今晩帰ってきて最初にポートの設定を見て、サーバー側のstart方法の中でreadIntが入ってきたudpPortも間違っていません.
戦車のIPとポートを保存するクラスで問題が発生し、
1,クライアントのudpパケットを受信するスレッドが起動していないことを考慮しますか?そこで、オンラインクラスUDPRecvThreadのrunメソッドにおけるSystem.out.println(「something」)は、プログラムを実行し、出力があり、スレッドが起動したことを示します.
2、初めてdebugを使ってみます.通常、プログラムは「a packet received from server」を出力すべきです.今は出力されていません.出力文の前のdsにブレークポイントを設定することを考えています.receive(dp)、debugを実行し、プログラムがreceiveに実行されてからStep over、プログラムが直接終了し、サーバ側がudpパケットを送信したかどうかを考慮する
3,サーバ側がudpパケットを送信かどうかはds.send(dp)の後に1つの“a packet sended”を出力して、そしてこのパケットを解析して、実行プログラムは出力文があることを発見して、解析のパケットも間違いがなくて、クライアントの戦車のパケットが成功してしかもパケットに問題がなくて、サーバーの端も成功を受信して、間違いの一環はサーバーが各クライアントに送信することを説明して、
4,ArrayListにクライアントタンクが入っているかどうかを確認し、チェックしても問題ありません
5,馬先生のソースコードと逐行比較することができなくて、コードを比較しても問題を発見していません
以上が昨夜の大まかな考え方で、もう1時になったので、洗い砕きました.
目を閉じて眠れなくて、考えを整理して、更に考えて、問題はサービス側がクライアントに送る過程で、クライアントは受け取っていないで、サービス側の送信アドレスが正しいかどうか、これ以上考えていないで、サービス側はudpパケットを送信する前にudpパケットに対してIPとポートを再設定して、戦車のIPとポートを取って、間違いないべきで、では、戦車が自分のIPとポートをサービス側に送るときに間違いはありませんか?明日検査しましょう.
今晩帰ってきて最初にポートの設定を見て、サーバー側のstart方法の中でreadIntが入ってきたudpPortも間違っていません.
戦車のIPとポートを保存するクラスで問題が発生し、
Client c = new Client(IP,udpPort);//new
/**
, ,udp upd
eclipse
**/
private class Client{
String IP;
int udpPort;
public Client(String IP , int updPort){
this.IP = IP;
this.udpPort = udpPort;// eclipse , , “Creat parameter udpPort”,
}
}
//
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
public class TankServer {
public static final int TCP_PORT = 8888;
public static final int UDP_PORT = 6666;
private static int ID = 100;
List clients = new ArrayList();
public void start(){
new Thread(new UDPThread()).start();
ServerSocket ss = null;
try {
ss = new ServerSocket(TCP_PORT);
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
Socket s = null;
try{
s = ss.accept();
DataInputStream dis = new DataInputStream(s.getInputStream());
int udpPort = dis.readInt();
String IP = s.getInetAddress().getHostAddress();
Client c = new Client(IP,udpPort);
clients.add(c);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeInt(ID++);
System.out.println("a Client is connected:"+s.getInetAddress()+":"+ s.getPort()+"----- udp Port:"+udpPort);
}catch(IOException e){
e.printStackTrace();
}finally{
if(s!=null){
try {
s.close();
s = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
new TankServer().start();
}
private class Client{
String IP;
int udpPort;
public Client(String IP , int udpPort){
this.IP = IP;
this.udpPort = udpPort;
}
}
private class UDPThread implements Runnable {
byte[] buf = new byte[1024];
@Override
public void run() {
DatagramSocket ds = null;
try {
ds = new DatagramSocket(UDP_PORT);
} catch (SocketException e) {
e.printStackTrace();
}
System.out.println("UDP thread started at port :"+ UDP_PORT);
while(ds!=null){
DatagramPacket dp = new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
for(int i=0;i
// ,NetClient
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class NetClient {
private static int UDP_PORT_START = 2223;
private int udpPort;
TankClient tc;
DatagramSocket ds = null;
public NetClient(TankClient tc){
udpPort = UDP_PORT_START ++;
this.tc = tc;
try {
ds = new DatagramSocket(udpPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void connect(String IP, int port) {
Socket s = null;
try {
s = new Socket(IP,port);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeInt(udpPort);
DataInputStream dis = new DataInputStream(s.getInputStream());
int id = dis.readInt();
tc.t.id = id;
System.out.println("connect to server ! ID:"+ id);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(s!=null){
try {
s.close();
s = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
TankNewMsg msg = new TankNewMsg(tc.t);
send(msg);
new Thread(new UDPRecvThread()).start();
}
public void send(TankNewMsg msg){
msg.send(ds,"localhost",TankServer.UDP_PORT);
}
private class UDPRecvThread implements Runnable{
byte[] buf = new byte[1024];
@Override
public void run() {
while(ds!=null){
DatagramPacket dp = new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
parse(dp);
System.out.println("a packet received from server");
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void parse(DatagramPacket dp) {
ByteArrayInputStream bais = new ByteArrayInputStream(buf,0,dp.getLength());
DataInputStream dis = new DataInputStream(bais);
TankNewMsg msg = new TankNewMsg();
msg.parse(dis);
}
}
}