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;
}
}