为了在局域网中玩,现在完成网络通信部分。采用的是udp连接,跟界面之间的交换通过event通信
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace Chess5
{
public class NetOp
{
#region 构造函数,析构函数
public NetOp()
{
while (checkPortValid(udpPort))
udpPort++;
}
~NetOp()
{
if (server != null)
server.Close();
if (client != null)
client.Close();
server = null;
client = null;
}
#endregion
#region 静态变量
static UdpClient server = null;
static UdpClient client = null;
#endregion
#region 字段
private int udpPort = 9000;
private Thread t;
#endregion
#region 事件
public event VoidTwoStringDelegate startGame;
public event VoidTwoStringDelegate endGame;
public event VoidOneStringTwoIntDelegate chess;
public event VoidTwoStringDelegate winGame;
#endregion
#region 私有函数
private bool checkPortValid(int port)
{
bool bTaken = false;
Process pro = new Process();
// 设置命令行、参数
pro.StartInfo.FileName = "cmd.exe";
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.RedirectStandardInput = true;
pro.StartInfo.RedirectStandardOutput = true;
pro.StartInfo.RedirectStandardError = true;
pro.StartInfo.CreateNoWindow = true;
// 启动CMD
pro.Start();
// 运行端口检查命令
pro.StandardInput.WriteLine("netstat -a -p UDP");
pro.StandardInput.WriteLine("exit");
// 获取结果
string line = null;
while ((line = pro.StandardOutput.ReadLine()) != null)
{
line = line.Trim();
if (line.Contains(":" + port + " "))
{
bTaken = true;
break;
}
}
pro.Close();
return bTaken;
}
private void beginUDPListen()
{
try
{
server = new UdpClient(udpPort, AddressFamily.InterNetwork);
IPEndPoint udpSender = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] udpData = server.Receive(ref udpSender);
string strudpData = Encoding.Default.GetString(udpData, 0, udpData.Length);
analyzeUdpData(strudpData);
}
}
catch (Exception e)
{
analyzeUdpData("Fatal Error: " + e.Message);
}
}
private void analyzeUdpData(string udpData)
{
string[] temp = udpData.Split(' ');
if (udpData.StartsWith("startGame:"))
{
if (startGame != null)
startGame(temp[1], temp[2]);
}
else if (udpData.StartsWith("endGame:"))
{
if (endGame != null)
endGame(temp[1], temp[2]);
}
else if (udpData.StartsWith("chess:"))
{
if (chess != null)
chess(temp[1], int.Parse(temp[2]), int.Parse(temp[3]));
}
else if (udpData.StartsWith("winGame:"))
{
if (winGame != null)
winGame(temp[1], temp[2]);
}
else
{
Msg.ShowInfo(udpData);
}
}
#endregion
#region 公开函数
public void StartListen()
{
t = new Thread(new ThreadStart(beginUDPListen));
t.Start();
}
public void endListen()
{
if (t != null)
{
t.Abort();
t = null;
}
if (server != null)
server.Close();
if (client != null)
client.Close();
server = null;
client = null;
}
public string sendUdp(string strUdpSendData, string targetUdpIp)
{
byte[] udpSendData = Encoding.Default.GetBytes(strUdpSendData);
IPAddress ipUDP;
if (checkIPFormat(targetUdpIp, out ipUDP))
{
try
{
IPEndPoint udpTarget = new IPEndPoint(ipUDP, udpPort);
client = new UdpClient(65534);
client.Connect(ipUDP, udpPort);
client.Send(udpSendData, udpSendData.Length);
client.Connect(ipUDP, udpPort + 1);
client.Send(udpSendData, udpSendData.Length);
client.Connect(ipUDP, udpPort - 1);
client.Send(udpSendData, udpSendData.Length);
client.Connect(ipUDP, udpPort + 2);
client.Send(udpSendData, udpSendData.Length);
client.Connect(ipUDP, udpPort - 2);
client.Send(udpSendData, udpSendData.Length);
client.Close();
}
catch (Exception)
{
analyzeUdpData("Fail to send UDP packet");
}
finally
{
if (client != null)
{
client.Close();
}
}
return "";
}
else
return "IP格式错误";
}
public bool checkIPFormat(string strIP, out IPAddress ipTCP)
{
ipTCP = IPAddress.None;
try
{
ipTCP = IPAddress.Parse(strIP);
}
catch (Exception)
{
return false;
}
string formatIP = @"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$";
Match regExIP = System.Text.RegularExpressions.Regex.Match(strIP, formatIP);
if (regExIP.Success)
{
string[] strIPNums = strIP.Split('.');
foreach (string strIPNum in strIPNums)
{
if (int.Parse(strIPNum) >= 255 || int.Parse(strIPNum) < 0)
return false;
}
return true;
}
else
return false;
}
#endregion
}
}
分享到:
相关推荐
五子棋小游戏的课程设计,有流程图,功能描述,源代码等内容,感觉挺好的。
### C语言实现的五子棋小游戏 #### 项目概述 本项目是一款基于C语言开发的五子棋小游戏,能够满足课程设计的要求。该程序具备基本的五子棋功能,支持两个用户之间的对战。游戏界面简洁明了,通过命令行进行操作与...
java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...
【HTML五子棋小游戏】是一种基于纯Web技术开发的在线娱乐项目,主要利用HTML、JavaScript(简称JS)以及HTML5的一些特性实现。这个小游戏无需安装任何客户端,只需将压缩包解压后在浏览器中打开,就能立即体验到...
《C++实现五子棋小游戏详解》 在编程领域,用C++开发一款五子棋小游戏是一项常见的练习项目,它既能巩固基础知识,又能提升实际编程技能。本文将深入探讨如何利用C++语言来实现五子棋游戏的核心逻辑,主要包括棋盘...
Java五子棋小游戏.zipJava五子棋小游戏.zipJava五子棋小游戏.zip Java五子棋小游戏.zipJava五子棋小游戏.zipJava五子棋小游戏.zip Java五子棋小游戏.zipJava五子棋小游戏.zipJava五子棋小游戏.zip Java五子棋小游戏....
【五子棋小游戏】是一款基于C++编程语言开发的小型桌面游戏,它的核心功能是让玩家与电脑AI进行对弈,体验五子棋的乐趣。在这款游戏中,玩家可以选择单人模式,与内置的智能算法进行较量。源代码中包含丰富的注释,...
HTML5网页版五子棋小游戏源码下载是一个包含所有必要组件和资源的压缩包,用于构建一个纯HTML5实现的在线五子棋游戏。这款小游戏可以让用户在网页上与电脑或者其他玩家对战,体验五子棋的乐趣。源码通常包括HTML、...
五子棋小游戏五子棋小游戏
java课程设计小游戏网络版五子棋小游戏源码+java课程设计报告.zipjava课程设计小游戏网络版五子棋小游戏源码+课程设计报告.zipjava课程设计小游戏网络版五子棋小游戏源码+课程设计报告.zipjava课程设计小游戏网络版...
五子棋小游戏是一种深受人们喜爱的传统智力游戏,它在计算机编程领域也有着广泛的应用,尤其在教学和游戏开发中。本项目提供了一个五子棋程序的实现,是学习现代软件基础,尤其是MFC(Microsoft Foundation Classes...
基于java的五子棋小游戏.zip基于java的五子棋小游戏.zip基于java的五子棋小游戏.zip 基于java的五子棋小游戏.zip基于java的五子棋小游戏.zip基于java的五子棋小游戏.zip 基于java的五子棋小游戏.zip基于java的五子棋...
【Java五子棋小游戏】是一款基于Java编程语言开发的简单娱乐项目,旨在提供一个100x100网格的棋盘,供玩家体验五子棋的乐趣。在这款游戏中,两个玩家轮流在棋盘上放置黑白棋子,目标是形成任意方向(横、竖、斜)上...
五子棋小游戏 java代码 其中包括数组的运用,循环,判断 方位等
在本文中,我们将深入探讨如何使用C#编程语言实现一个五子棋小游戏,以及涉及到的client端与server端通信机制。五子棋是一种简单而有趣的双人策略游戏,通过编程实现,可以为学习C#和网络编程提供一个很好的实践平台...
《JAVA五子棋小游戏代码详解》 五子棋是一款经典的双人对弈游戏,通过JAVA编程语言实现五子棋小游戏,可以提供一个简单的娱乐平台,同时也展示了基础的GUI设计和事件处理技术。以下是对该代码的详细解析: 首先,...
本篇将详细讲解基于Java开发的五子棋小游戏源码的相关知识点。 1. **基础概念** - **Java基础**:Java小游戏五子棋源码的基础是Java编程语言,它包括类、对象、接口、继承、封装、多态等核心概念。理解这些基础是...
java之好玩的五子棋小游戏,可单人对战,多人对战!java之好玩的五子棋小游戏,可单人对战,多人对战!java之好玩的五子棋小游戏,可单人对战,多人对战!java之好玩的五子棋小游戏,可单人对战,多人对战!java之...