评论设计
Debug:Tomcat deploy twice
Btrace Sample Scripts
Btrace is very powerful tool for online debugging, here is the sample scripts in tar btrace.
The scripts are very useful, so I decide to upload them. Here is the scripts below:
- AWTEventTracer.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AWTEventTracer.java
- AllCalls1.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllCalls1.java
- AllCalls1Sampled.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllCalls1Sampled.java
- AllCalls2.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllCalls2.java
- AllCalls2Sampled.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllCalls2Sampled.java
- AllCalls3.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllCalls3.java
- AllCalls3Sampled.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllCalls3Sampled.java
- AllLines.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllLines.java
- AllMethods.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllMethods.java
- AllMethodsSampled.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllMethodsSampled.java
- AllSync.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-AllSync.java
- ArgArray.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-ArgArray.java
- Classload.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Classload.java
- CommandArg.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-CommandArg.java
- DTraceInline.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-DTraceInline.java
- DTraceRefDemo.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-DTraceRefDemo.java
- Deadlock.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Deadlock.java
- FileTracker.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-FileTracker.java
- FinalizeTracker.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-FinalizeTracker.java
- HistoOnEvent.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-HistoOnEvent.java
- Histogram.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Histogram.java
- HistogramBean.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-HistogramBean.java
- JInfo.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-JInfo.java
- JMap.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-JMap.java
- JStack.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-JStack.java
- JdbcQueries.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-JdbcQueries.java
- LogTracer.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-LogTracer.java
- MemAlerter.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-MemAlerter.java
- Memory.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Memory.java
- MultiClass.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-MultiClass.java
- NewArray.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-NewArray.java
- NewComponent.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-NewComponent.java
- OnThrow.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-OnThrow.java
- ProbeExit.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-ProbeExit.java
- Profiling.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Profiling.java
- Sizeof.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Sizeof.java
- SocketTracker.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-SocketTracker.java
- SocketTracker1.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-SocketTracker1.java
- SubtypeTracer.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-SubtypeTracer.java
- SysProp.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-SysProp.java
- Test.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Test.java
- ThreadBean.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-ThreadBean.java
- ThreadCounter.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-ThreadCounter.java
- ThreadCounterBean.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-ThreadCounterBean.java
- ThreadStart.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-ThreadStart.java
- Timers.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-Timers.java
- URLTracker.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-URLTracker.java
- WebServiceTracker.java : http://7xnmye.com1.z0.glb.clouddn.com/btrace-WebServiceTracker.java
You can access them with curl or wget, wish you happy debugging!
利用Autoconfig打包Java WEB应用
Java也能玩转WebSocket
利用Tair实现分布式并发锁
C#网络编程初步之TCP
阅读背景:本文针对有C#的初学者而写的,主要讲解如何利用C#进行网络编程。
如果你已经有一些网络编程的经验(只需要懂得网络编程的基本常识即可),并且理解C#的基本语法,那么这篇文章可以很快地带你进入C#网络编程的世界。
如果你的基础不好,也不要紧,我相信这篇文章也会有你需要的内容。
网络编程基础复习:
图1. TCP编程基本模型
相信很多人看到图1应该不会陌生,这是一个利用TCP进行通信的经典模型图。我想大家都应该把这张图记在心中。
在此我就不讲述上图中每个API的意思了,百度一下,你就知道。我想说的是,难道你不觉得这么编程很累吗?
我们需要去调用每个API函数,然后每个判断返回值是多少,如果你忘记了哪个API的参数形式还得去查MSDN,这种时间花费是巨大的,尤其当你做应用层的快速开发时。
图2是利用UDP通信时的编程基本模型,这个模型较为简单,但是应用极为广泛,相比TCP而言,我本人觉得利用UDP通信是一门更为高深的技术,因为它是无连接的,
换言之,它的效率与灵活度就更高些。
图2. UDP编程基本模型
在此我补充一点,关于何时利用TCP通信、何时利用UDP通信的问题。他们的特性其实已经决定了他们的适用范围。
在进行大数据量、持续连接时,我们使用TCP,例如FTP协议;而在进行小规模数据、突发性高的通信时,我们使用UDP,例如聊天程序。
但是,这并不是绝对的事情。例如流媒体通信,它是大数量、持续的通信,但是使用的是UDP协议,为什么呢?
——因为我们不关心丢失的帧,人的肉眼是无法识别出少量的帧丢失的。那么使用UDP通信就可以大幅度提高效率,降低网络负载。
C#之TCP编程
如何创建一个套接字?
我们先来看看利用Winsock2是如何建立一个套接字的:
首先,我们要加载套接字库,然后再建立套接字。大致代码如下:
WORD wVersion=MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(wVersion,&wsaData))
{
WSACleanup();
returnFALSE;
}
m_sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL,0,0);
if(m_sock==INVALID_SOCKET)
{
MessageBox("创建套接字失败!");
return FALSE;
}
难道你不觉得利用Winsock2创建一个套接字很费劲吗?如果你在Linux环境中变成倒是可以省掉加载套接字的部分,
但是却只能反复的调用API,这样也是很费时的事情。那我们再看看看利用C#是如何帮你简化工作的。这里我会介绍TCPClient类。
以上是从MSDN上截取的一段话,可见我们利用TCPClient还处理与TCP通信相关的操作。TCPClient有四个构造函数,每个构造函数的用法是有不同的。这里我补充一个知识,那就是端地址在C#中描述。
我们知道,我们用一个IP地址和一个端口号就可以表示一个端地址。在C#中我们利用IPEndPoint类来表示一个端地址,本人经常利用如下的构造函数来创建一个IPEndPoint类。
IPEndPoint localEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"),6666);
这样来表示一个端地址是不是比创建一个struct sockaddr_in的结构体来的快呢?
如何绑定一个端地址?
我们已经创建了一个端地址,也构造了套接字(TCPClient类),那么如何将二者绑定起来呢?也许你已经发现了,在建立TCPClient的时候我们其实就可以绑定端地址了。
如果你使用的TCPClient tcp_Client=new TCPClient()的构造函数来创建的TCPClient,那么系统会认为你没有人为的制定端地址,而会自动帮你制定端地址,在创建客户端的TCPClient时我们常常这样做,
因为我们不关心客户端的端地址。如果是服务器监听呢?在服务器监听时我们会使用例外一个类,叫做TCPListener,接下来我会讲到。我们可以利用TCPClient(IPEndPoint)来构造一个绑定到固定端地址的TCPClient类。例如:
TcpClient tcp_Client = new TcpClient(localEP);
如何监听套接字?
到现在为此我们还没讨论如何监听一个套接字。在传统的socket编程中,我们创建一个套接字,然后把它绑定到一个端地址,而后调用Listen()来监听套接字。而在C#中,我们利用TCPListener来帮我们完成这些工作。让我们先来看看如何在C#监听套接字。
IPEndPointlocalEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"),6666);
TcpListenerListener = new TcpListener(localEP);
Listener.Start(10);
我们首先创建需要绑定的端地址,而后创建监听类,并利用其构造函数将其绑定到端地址,然后调用Start(int number)方法来真正实施监听。这与我们传统的socket编程不同。以前我们都是先创建一个socket,然后再创建一个sockaddr_in的结构体。我想你应该开始感受到了C#的优势了,它帮我们省去了很多低级、繁琐的工作,让我们能够真正专注于我们的软件架构和设计思想。
如何接受客户端连接?
接听套接字后面自然就是接受TCP连接了。我们利用下面一句话来完成此工作:
TcpClient remoteClient =Listener.AcceptTcpClient();
类似于accept函数来返回一个socket,利用TCPListener类的AcceptTcpClient方法我们可以得到一个与客户端建立了连接的TCPClient类,
而由TCPClient类来处理以后与客户端的通信工作。我想你应该开始理解为什么会存在TCPClient和TCPListener两个类了。
这两个类的存在有着更加明细的区分,让监听和后续的通信真正分开,让程序员也更加容易理解和使用了。
这里我还得补充一点:监听是一个非阻塞的操作Listener.Start()
,而接受连接是一个阻塞操作Listener.AcceptTcpClient
。
说了这么多,还不如来个实例来的明确。接下来,我会通过一个简单的控制台聊天程序来如何使用这些。先贴代码吧!
服务器端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Demo
{
class Program
{
static void Main(string[]args)
{
byte[]SendBuf = Encoding.UTF8.GetBytes("Hello,Client!"); //发给客户端的消息;
IPEndPointlocalEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"),6666); //本地端地址
TcpListenerListener = new TcpListener(localEP); //建立监听类,并绑定到指定的端地址
Listener.Start(10); //开始监听
Console.WriteLine("Server is listening...");
TcpClientremoteClient = Listener.AcceptTcpClient(); //等待连接(阻塞)
Console.WriteLine("Client:{0} connected!",remoteClient.Client.RemoteEndPoint.ToString()) ; //打印客户端连接信息;
remoteClient.Client.Send(SendBuf); //发送欢迎信息;
remoteClient.Close(); //关闭连接;
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Demo_Client
{
class Program
{
static void Main(string[] args)
{
byte[] RecvBuf=new byte[1024]; //申请接收缓存;
int RecvBytes = 0; //接收字节数;
string recvmsg=null; //接收消息;
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666); //远程服务器端地址;
TcpClient remoteServer = new TcpClient(); //创建TCPClient类来与服务器通信;
remoteServer.Connect(remoteEP); //调用connect方法连接远端服务器;
Console.WriteLine("I'm using {0}.", remoteServer.Client.LocalEndPoint); //打印自己使用的端地址;
RecvBytes=remoteServer.Client.Receive(RecvBuf); //接受服务器发送过来的消息;
recvmsg=Encoding.UTF8.GetString(RecvBuf,0,RecvBytes); //将接受到的字节码转化为string类型;
Console.WriteLine("Server says:{0}.", recvmsg); //打印欢迎信息;
}
}
}
在C#网络编程中,我们要用到两个名空间,分别是System.Net和System.Net.Socket。
可能有人会有这样的疑惑,干嘛要申请一个Byte数组。我们知道,在传统socket编程中,我们都是用char来发送或者接受消息的,
其实char和Byte[]是同源的。他们都是一个Byte,而使用Byte[]能更易于人们理解和转化为其他类型。我们知道网络间传输的字节流,而Byte[]刚好符合了这个思想。
如果对以上类的用法不理解或者不熟悉的话,建议查看MSDN,上面讲解的很详细。
现在看看运行效果:
图3 运行效果(左为服务器,右为客户端)
好啦,到这里我们C#网络编程初步之TCP基本上算告一段落了,我只讲解了最为基础的部分,仅做抛砖引玉的作用。每个类的使用千变万化,希望你能找到最适合自己使用方法。现在你可以对比以前类似程序的代码了,看看我前面有没有说错。而且,越到后来你会越来越体会到C#人性化的一面。
后期的博文中,我会更新C#网络编程初步之UDP.本人更喜欢利用UDP来进行通信,至于为什么我已经说过了。以后,我会逐步写一些网络编程的高级内容,例如异步通信、多线程编程,并关注程序员经常遇到的一些棘手问题,比如TCP边界的确定等等。有机会,我也会同大家讨论网络编程中常用的软件设计思想与架构。
(本文图1、图2来自互联网,有部分信息来自MSDN。如需转载本文,请注明出处!谢谢)
超小型局域网组建的方案
生活中我们经常会遇到需要组建一个超小型局域网共享上网的问题,比如在学校组建一个小型局域网共享上网,或者组建一个家庭网络共享上网等,在此过程中会碰到很多小问题,
本人故撰此文,望能减少一些不必要的麻烦。
在学校上网,可以通过校园网,也可以通过电信宽带或者ADSL拨号上网(通过电话线上网)等。通过校园网上网,经济实惠,当然网速也是惊人的,尤其是喜欢玩游戏的同学就更悲剧了。
通过校园网上网没有什么灵活性和扩展性,故在此不讲了。就以通过电信上网为例来进行分析与组建。如果你们寝室或出租屋有宽带接入,那么恭喜你了,
你可以省下一个“猫”钱。4台PC以下共享上网的话,那必需购置一台4孔的交换机,一般在40~50元左右,然后购置网线若干,就是普通的直连线,一块钱一米的那种。(像我们学校水晶头都收钱,悲剧!)
至此,所需的硬件就准备好了。
然后就是子网划分了,由于是超小型局域网,在这里可以使用C类IP私有地址,即192.168.A.B ,子网掩码为255.255.255.0,网关为192.168.A.1 。(网关最后一位可以改变,但一旦确定就不应更改。)
注意:0=<A<=254,A一旦确定也不应更改,1=<B<=254随着不同的PC应不同,不应重复。显然,该子网划分可允许254台PC接入,完全满足超小型局域网组建的需要。
子网划分完之后就是将相应的IP地址填入本地网络适配器中,可参照下图。
到此局域网以组建完毕,可以进行局域网的对战、文件交互等操作,如果想连上Internet,那就继续往下看吧!
DNS应填写你所在区的DNS服务器的IP地址,例如你在湘大,可以填写首选DNS:208.67.222.222
,备用DNS:202.67.220.220
.
填写完之后就单击确定。
在此强调,除IP地址最后一位外,其余的在不同PC配置时均不要更改,切记!
接下来就是一些必要软件的安装,既然是通过电信上网,那就要装星空极速。然后在填入电信给你的上网账号就可以上网了,当然此时还只有你一个人能上网。其实有条件的同学可以包电信的“我的一家”这种上网业务,它允许多台PC共用一个账号上网。湖南电信这边上网是绑定MAC地址的,理应只允许一个账号让一台PC机上网,其实这是很不合理的。废话少说,要想多台PC共享上网,可以让交换机拨号,当然你买的交换机要支持拨号这种功能,具体操作可以上网BAIDU一下。也可以选择共享上网软件,在此我推荐湘大学长自己做的一款软件,拼卡啦,这是我用过的最好用的共享上网软件,简单,方便,我也感到蛮自豪的。在湘大上网用这款软件完全没问题,不过在其他地方上不上的了我就不知道了。关于这款软件的使用方法可以参照http://www.xiaorsz.com/lan-internet-sharing-software-pinkala-download/ 。
在此说明一下,一台PC通过星空极速拨号上网后,然后在通过拼卡啦创建共享,其余的PC通过拼卡啦加入共享即可都上网了。网络上还有很多其他的共享上网软件,比如CCPROXY,不过需要一台PC充当服务器,像拼卡啦这样实现服务器切换这么方便的,我还没发现。
好啦,现在我们已经可以多机共享上网啦!
如果你是包年的用户,或者不计流量的那种,建议使用交换机、路由器、猫自动拨号上网,很方便,插上网线就能上!如果有流量限制,且共享上网的PC较多,
(比如我原来寝室的6台PC共用一个账号上网的那些耻人们,呵呵,开个玩笑!)建议用共享软件上网,虽然每次都要拨号,不过可以省流量!
如果你住在南苑,600块钱一年的那种难寝室,那就只用通过ADSL上网了,有得上就行!那你得乖乖的买个猫,二手的也行。把电话线连接分线器,分线器一端连接座机,一段连接猫。然后猫在连接交换机的普通以太网口,有的交换接有个WAN接口,不要连那个。然后PC在连接到交换机即可,其他配制方法同上。
因为是共享上网,电信本着能赚就赚的原则肯定是不允许的。你会发现优势网页打不开但是QQ却登的上,这是因为电信查封了你们的80(HTTP服务使用的)端口,这是一个知名端口,而QQ是用随机端口,它就没办法了。此时,让那台拨号的PC端口重连一下就又可以打开网页了,因为这是换了个公网IP。
好啦,写到这里也就结束了。我省略了很多细节,大家都可以Baidu的到,希望对想共享上网的同学有所帮助。
如果有其他的方案也可以留言,互相交流!