📄 netclient.java
字号:
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.Socket;
import java.net.SocketException;
public class NetClient {
private int udpport;
private String ip;
private TankClient tc;
private DatagramSocket ds;
Msg msg;
public NetClient(TankClient tc) {
this.tc = tc;
}
public void connect(String ip, int udpport) {
Socket s = null;
try {
ds = new DatagramSocket(udpport);
} catch (SocketException e) {
System.out.println("UDP服务器未启动,不能连接!!");
} finally {
System.out.println(tc.isConnect() + "我运行到了!!");
}
try {
s = new Socket(ip, TankServer.TCP_PORT);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeInt(udpport);
System.out.println("已和服务器取得连接!");
DataInputStream dis = new DataInputStream(s.getInputStream());
int tankId = dis.readInt();
// 当得到双数坦克是我方,当得到奇数坦克是敌方
if (tankId != -1) {
tc.login.setVisible(false);
if (tankId % 2 == 0) {
tc.tank.setGood(true);
} else {
tc.tank.setGood(false);
}
tc.tank.setTankId(tankId);
tc.setConnect(true);
} else {
// 判断人数满的情况下执行的操作
int key = javax.swing.JOptionPane.showConfirmDialog(null,
"房间人数已满,请稍后再试...");
System.out.println("人数满" + key);
if (key >= 0) {
System.exit(0);
}
}
s.close();
} catch (Exception e) {
System.out.println("TCP服务器未启动,不能连接!!");
}
msg = new TankNewMsg(tc.tank);
send(msg);
new UDPThread();
}
public void send(Msg msg) {
msg.send(ds, ip, TankServer.UDP_PORT);
}
class UDPThread implements Runnable {
byte[] buf = new byte[1024];
public UDPThread() {
new Thread(this).start();
}
public void run() {
while (true) {
try {
DatagramPacket dp2 = new DatagramPacket(buf, buf.length);
ds.receive(dp2);
if (dp2.getLength() != 0) {
parse(dp2);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void parse(DatagramPacket dp) {
ByteArrayInputStream bais = new ByteArrayInputStream(buf, 0, dp
.getLength());
DataInputStream dis = new DataInputStream(bais);
int msgType = 0;
try {
msgType = dis.readInt();
switch (msgType) {
case 1:
msg = new TankNewMsg(tc);
msg.parse(dis);
break;
case 2:
msg = new TankMoveMsg(tc);
msg.parse(dis);
break;
case 3:
msg = new TankFireMsg(tc);
msg.parse(dis);
break;
case 4:
msg = new TankDeadMsg(tc);
msg.parse(dis);
break;
case 5:
msg = new AutoTankNewMsg(tc.tank, tc, tc.badTanks.size());
msg.parse(dis);
break;
case 6:
msg = new UserTalkMsg(tc);
msg.parse(dis);
break;
case 7:
msg = new GameStartMsg(tc);
msg.parse(dis);
break;
case 8:
msg = new CreateWallsMsg(tc);
msg.parse(dis);
break;
case 9:
msg = new NewItemMsg(tc, null);
msg.parse(dis);
break;
case 10:
msg = new RemoveItemMsg(tc, null);
msg.parse(dis);
break;
case 11:
msg = new GameOverMsg(tc);
msg.parse(dis);
break;
case 12:
msg = new MissileDeadMsg(0, tc);
msg.parse(dis);
break;
case 13:
msg = new JoinRepaintMsg(tc);
msg.parse(dis);
break;
case 14:
msg = new RemoveTankMsg(tc);
msg.parse(dis);
break;
case 1000:
msg = new UserInfoMsg(tc);
msg.parse(dis);
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public int getUdpport() {
return udpport;
}
public void setUdpport(int udpport) {
this.udpport = udpport;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -