写完单机版http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx游戏后
再写个网络版玩玩。
开发工具vs2008
网络版实现方法很简单
1.一个服务端,多个客户端
2.服务端开个端口监听,当一个客户端程序后连接到服务端后,服务端分配个编号给客户端作为他的坦克编号
3.当有新坦克创建,坦克移动,等操作时,客户端发送数据到服务端,服务端再把数据发送到所有的客户端来实现网络游戏的同步
具体实现代码
1.服务端开启服务代码
public void Start()
{
//开启udp线程
Thread t = new Thread(UDPThread);
t.IsBackground = true;
t.Start();
//开启tcp服务
TcpListener tl = new TcpListener(TCP_PORT);
tl.Start();
while (true)
{
TcpClient tc = tl.AcceptTcpClient();
Stream ns = tc.GetStream();
BinaryReader br = new BinaryReader(ns);
int udpPort = br.ReadInt32();//br.Close();不能关闭br
BinaryWriter bw = new BinaryWriter(ns);
bw.Write(ID++);
IPEndPoint rep = (IPEndPoint)tc.Client.RemoteEndPoint;
Client c = new Client(rep.Address.ToString(), udpPort);
clients.Add(c);
Console.WriteLine("A Client TCP Connect! Addr- " + rep.Address.ToString() + ":" + rep.Port);
}
}
2.服务端udp数据接收转发代码
private void UDPThread()
{
Console.WriteLine("UDP thread started at port :" + UDP_PORT);
byte[] buf = new byte[1024];
UdpClient uc = new UdpClient(UDP_PORT);//// 跟java有区别 如果这句话放到while外面 就不能接受第二个坦克连入
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
buf = uc.Receive(ref ipep);
Console.WriteLine("a udp packet received! from " + ipep.Address + ":" + ipep.Port);
//把收到的数据转发给每一个客户端
for (int i = 0; i < clients.Count; i++)
{
Client c = clients[i];
UdpClient _uc = new UdpClient();
_uc.Connect(c.ip, c.udpPort);
_uc.Send(buf, buf.Length);
1