1、正则表达式一个奇怪的问题
// 一个神奇现象,\x{2}时调用Regex竟然会引起网络异常(BaoServer2-RecvAsync-catch (Exception ex),ex为null),哈哈哈
public string __Deal(string msg)
{
msg = "%34#RDD12345678995B\r";
string pat = @"%(?<Id>\d+)#RDD(?<Begin>\d{5})(?<End>\d{5})(?<Check>\x{2})";//\\r";
var m = Regex.Match(msg, pat);
return "";
}
原因:未知
解决:不用\x了,以为\x与\d一样,一个表示十六进制,一个表示十进制
补充:
错误原因终于找到了,是因为某些语句抛出异常,而这些语句都是在receive的线程处理过程中,于是引发了异常后的socket被关闭:)
receive语句:
private async void RecvAsync(Socket acceptSocket)
{
await Task.Run(new Action(() =>
{
int len = 0;
byte[] buffer = new byte[bufferSize];
try
{
while ((len = acceptSocket.Receive(buffer, bufferSize, SocketFlags.None)) > 0)
{
if (recvStrEvent != null)
recvStrEvent(acceptSocket.RemoteEndPoint.ToString(), Encoding.Default.GetString(buffer, 0, len));
}
}
catch
{
CloseClientSocket(acceptSocket);
}
}));
}
结论:看似奇怪的东东必有蹊跷,一切都有因果。
2、mysql大小写敏感的问题
unix系统下对文件的大小写敏感,而windows下对文件的大小写不敏感,因此也影响了mysql的大小写敏感性问题。
1)生成及修改配置文件my.ini
参见 https://blog.csdn.net/weixin_47076063/article/details/110670183
2)在其中增加一句
#设置大小写不敏感
lower_case_table_names=1
完整配置文件如下:
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port =3306
#设置安装目录
basedir=D:\\mysql8021\\bin
#设置数据存放目录
datadir=D:\\mysql8021\\data
#允许最大连接数
max_connections=200
#创建新表时将使用带默认存贮引擎
default-storage-engine=INNODB
#设置大小写不敏感
lower_case_table_names=1
3、一个搞笑的调试问题
设了断点,可是发现是无效的,后来发现根本就不是这个启动项目。哈哈哈,启动的是另一个项目!
还调试个屁。
4、一个socket已经disposed的问题
现象:客户端断开连接之后,再次连接时,服务端没有响应消息过来。
定位:断点跟踪到如下语句:
Socket so = clientSockets.Find(c => c.RemoteEndPoint.ToString() == cip);
SendAsync(so, message);
第一句竟然走不到第二句,好奇怪,其实应该明白,第一句抛出异常了!
其实是由于c.RemoteEndPoint引起的,访问了已经disposed的东东了,哈哈
'c.RemoteEndPoint' threw an exception of type 'System.ObjectDisposedException'
解决:在前面对socket进行过滤,把已经释放的玩意儿都从列表中删除掉。
for (int i = clientSockets.Count - 1; i >= 0; i--)
{
try
{
var c = clientSockets[i].RemoteEndPoint;
}
catch
{
// 'c.RemoteEndPoint' threw an exception of type 'System.ObjectDisposedException'
// 删除之,for循环从后向前扫过
clientSockets.RemoveAt(i);
}
}
5、socket accept时,不时的有新的连接上来,而逻辑上这些连接不应该有啊
问题:如题,一头雾水,客户端只有开始的一次连接啊
定位:客户端接收语句中,如果有异常,会启动重连!原来如此
原因:由于有个业务处理的地方出现了bug,sql语句抛出了异常,而该异常被接收端的try到了,
于是重连,就是这么的曲折,
于是,连接太多了,导致服务端资源枯竭,不再接收新的连接,于是还以为是服务端的bug呢,调试了一个下午啊。实际上是客户端业务部分的bug啊。
贴客户端接收部分的代码:
private async void RecvAsync()
{
await Task.Run(new Action(() =>
{
int len = 0;
byte[] buffer = new byte[bufferSize];
while ((len = connectSocket.Receive(buffer, bufferSize, SocketFlags.None)) > 0)
{
if (recvMessageEvent != null)
recvMessageEvent(Encoding.UTF8.GetString(buffer, 0, len));
}
//try
//{
// while ((len = connectSocket.Receive(buffer, bufferSize, SocketFlags.None)) > 0)
// {
// if (recvMessageEvent != null)
// recvMessageEvent(Encoding.UTF8.GetString(buffer, 0, len));
// }
//}
//catch (Exception ex)
//{
// Restart();
//}
}));
}
6、socket 关闭的标准代码
connectSocket.Shutdown(SocketShutdown.Both);
connectSocket.Close();
connectSocket = null;
这样,资源释放的比较干净了,server端也不会保留残留的连接,不会引起资源泄露。
当然,实际使用时,外面要加上try。
7、两个典型错误
1)abcd.txt文件中有错误,例如少或多逗号等,导致异常后使用了缺省的参数,新设置的端口没有找到,感到有些奇怪。
解决:加打印语句,将错误标识出来,以后加Log写入文件中。
2)使用另一个端口时,消息老是中断,Restart,有点丈二和尚,两个端口有啥区别啊?
原因:两个端口当然没有区别了,但是,业务上,不同的端口对应不同的数据库表啊,有一个端口就是没有建对应的表,导致异常,重启了。
解决:加打印语句,加数据库表了。
8、mysql创建表时,不能使用上引号
使用上引号会报错,
解决:1)使用小的上引号,就像workbench中的那样
2)将上引号全部去掉也无妨,就是说,一个上引号都不用也行,用了反而画蛇添足:)
例句如下:
CREATE TABLE almmsg_3(almmsg_3_id INT NOT NULL AUTO_INCREMENT,PRIMARY KEY(almmsg_3_id))