java——棋牌类游戏五子棋(webwzq1.0)之二(通讯)

package socket;


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
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;

import msg.Msg;
import msg.NewGameMsg;
import msg.YourTurnMsg;




/***************************************************************************
 * TODO
 * <br>Created on 2013-7-3 上午11:20:19<br>
 * @author daicy
 ***************************************************************************/
public class GameServer {
	//private static int ID = 0;
	
	/**
	 * TCP的监听端口
	 */
	public static final int TCP_PORT = 8888;
	
	/**
	 * UDP的监听端口
	 */
	public static final int UDP_PORT = 6666;
	
	public SocketData socketData;

	List<Client> clients = new ArrayList<Client>();
	
	DatagramSocket ds = null;
	
	public int gameState;  //0准备 1 抢地主2出牌; -1 结束
	
	int useNums = 2;
	
	/**
	 * 启动服务器
	 *
	 */
	public void start() {
		
		
		try {
			ds = new DatagramSocket(UDP_PORT);
		} catch (SocketException e) {
			e.printStackTrace();
		}
		System.out.println("UDP thread started at port :" + UDP_PORT);

		new Thread(new UDPThread()).start();

		ServerSocket ss = null;
		try {
			ss = new ServerSocket(TCP_PORT);
		} catch (IOException e) {
			e.printStackTrace();
		}


		while (true) {
			    if(gameState==0){
		    	    int size = 2-clients.size();
					for (int i = 0; i < size; i++)  {
						Socket s = null;
						try {
							s = ss.accept();
							ObjectInputStream dis = new ObjectInputStream(s.getInputStream());
							String IP = s.getInetAddress().getHostAddress();
							Integer udpPort = (Integer) dis.readObject();
							Client c = new Client(IP, udpPort);
							clients.add(c);
							ObjectOutputStream dos = new ObjectOutputStream(s.getOutputStream());
							dos.writeObject(i);
							// s.close();
							System.out.println("A Client Connect! Addr- "
									+ s.getInetAddress() + ":" + s.getPort()
									+ "----UDP Port:" + udpPort);
							
						} catch (IOException e) {
							e.printStackTrace();
						} catch (ClassNotFoundException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						} finally {
							if (s != null) {
								try {
									s.close();
									s = null;
								} catch (IOException e) {
									e.printStackTrace();
								}
							}
						}
					}
					newGame();
					
			    }
			  
		}
       
		
	}
	
	public void newGame(){
		socketData = new SocketData();
		for (int i = 0; i < useNums; i++)  {
			NewGameMsg msg = new NewGameMsg(socketData);
			msg.send(ds, clients.get(i).IP, clients.get(i).udpPort);
		}
		
		//随机产生谁是地主
		Integer num = (int) (Math.random() * useNums);
		YourTurnMsg msg = new YourTurnMsg(num);
		msg.send(ds, clients.get(num).IP, clients.get(num).udpPort);
		
		gameState = 1;
	}

	public static void main(String[] args) {
		GameServer gameServer = new GameServer();
		gameServer.socketData = new SocketData();
		gameServer.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];

		public void run() {
			
			while (ds != null) {
				DatagramPacket dp = new DatagramPacket(buf, buf.length);
				try {
					ds.receive(dp);
					if(!parse(dp)){
						for (int i = 0; i < clients.size(); i++) {
							Client c = clients.get(i);
							dp.setSocketAddress(new InetSocketAddress(c.IP,
									c.udpPort));
							ds.send(dp);
						}
					}
					
					System.out.println("a packet received!");
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		
		private boolean parse(DatagramPacket dp) {
			ByteArrayInputStream bais = new ByteArrayInputStream(buf, 0, dp
					.getLength());
			ObjectInputStream dis ;
			int msgType = 0;
			try {
				dis = new ObjectInputStream(bais);
				msgType = (Integer) dis.readObject();
				switch (msgType) {
					case Msg.RESTART:
						   newGame();
						   return true;
					case Msg.WIN:
						   //newGame();
						
				}
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return false;

		}


	}
}
package socket;


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

import msg.Msg;
import msg.NewGameMsg;
import msg.SendMoveMsg;
import msg.WinMsg;
import msg.YourTurnMsg;

import basegame.GameFrame;




/***************************************************************************
 * TODO
 * <br>Created on 2013-7-3 上午11:20:28<br>
 * @author daicy
 ***************************************************************************/
public class NetClient {
	GameFrame tc;

	private int udpPort;

	String IP; // server IP

	DatagramSocket ds = null;
	
	SocketData socketData ;
	
	Integer[][] playerOrders = {{2,0,1},{0,1,2},{1,2,0}};

	
	
	/**
	 * 根据场所构建网络客户端
	 * @param tc 游戏场所
	 */
	public NetClient(GameFrame tc) {
		this.tc = tc;

	}
	
	/**
	 * 连接服务器
	 * @param IP 服务器IP
	 * @param port 服务器端口
	 */
	public void connect(String IP, int port) {

		this.IP = IP;

		try {
			ds = new DatagramSocket(udpPort);
		} catch (SocketException e) {
			e.printStackTrace();
		}

		Socket s = null;
		try {
			s = new Socket(IP, port);
			ObjectOutputStream dos = new ObjectOutputStream(s.getOutputStream());
			dos.writeObject(udpPort);
			ObjectInputStream dis = new ObjectInputStream(s.getInputStream());
			int id = (Integer) dis.readObject();
			tc.id = id; 

			System.out.println("Connected to server! and server give me a ID:"
					+ id);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (s != null) {
				try {
					s.close();
					s = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		new Thread(new UDPRecvThread()).start();
	}
	
	/**
	 * 发送消息
	 * @param msg 待发送的消息
	 */
	public void send(Msg msg) {
		msg.send(ds, IP, GameServer.UDP_PORT);
	}

	private class UDPRecvThread implements Runnable {

		byte[] buf = new byte[2048];

		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());
			ObjectInputStream dis ;
			int msgType = 0;
			try {
				dis = new ObjectInputStream(bais);
				msgType = (Integer) dis.readObject();
				Msg msg = null;
				switch (msgType) {
					case Msg.NEWGAME:
						msg = new NewGameMsg(NetClient.this.tc);
						msg.parse(dis);
						break;
					case Msg.YOURTURN:
						msg = new YourTurnMsg(NetClient.this.tc);
						msg.parse(dis);
						break;
					case Msg.SENDEDPOKER:
						msg = new SendMoveMsg(NetClient.this.tc);
						msg.parse(dis);
						break;
					case Msg.WIN:
						msg = new WinMsg(NetClient.this.tc,NetClient.this);
						msg.parse(dis);
						break;
				}
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}
	
	/**
	 * 取得UDP端口(客户端接收数据用)
	 * @return
	 */
	public int getUdpPort() {
		return udpPort;
	}
	
	/**
	 * 设定UDP端口(客户端接收数据用)
	 * @param udpPort
	 */
	public void setUdpPort(int udpPort) {
		this.udpPort = udpPort;
	}
}

package socket;


import java.io.Serializable;

public class SocketData implements Serializable {
	/** */
	private static final long serialVersionUID = 1L;
	int[][] baseChessBoard;
	public SocketData(){
	}
	public int[][] getBaseChessBoard() {
		return baseChessBoard;
	}
	public void setBaseChessBoard(int[][] baseChessBoard) {
		this.baseChessBoard = baseChessBoard;
	}
	
	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java码界探秘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值