⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netclient.java

📁 基于尚学堂坦克大战的基础上开发,支持多人对战,在线聊天,坦克大战网络版.
💻 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 + -