re: Java Stream Xiaobo Sun 2008-12-16 09:52
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
String s;
while (bufferedReader.read() != -1) {
System.out.println("input something:");
s = bufferedReader.readLine();
System.out.println("input is: " + s);
}
}
======================================
java io 有两种类型的读写方法。
一种是以字节为单位读写的,InputStream、OutputStream(interface) 下面有很多类像FileInputStream、PipedInputStream 等皆继承了上述接口。
另外一种就是你上面提到的以unicode为单位进行读写的方法。 表现为 Reader、Writer、接口,像BufferedReader 就继承了Reader接口。
BufferedReader ****===> 在读取的时候,会先开辟一个缓冲区,把这些数据读到缓冲区,等到满了以后,就直接拿出来。
至于InputStreamReader,****===> An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and translates them into characters according to a specified character encoding.通过这个类可以把这两种方式读取出来的信息相互切换。
system.in ****===> 这是控制台输入信息时读入的管道。她继承PrintStream ,而PrintStream 类 继承了FilterOutputStream 类。这个类实现了OutputStream 接口。
re: Linux 启动 Xiaobo Sun 2008-12-10 20:32
启动服务
安装完成后,vsftpd是作为一个独立的服务启动,不接受xinetd的管理。系统会自动在Service列表中添加名称vsftpd的服务。启动服务的步骤如下:
1、Yast→System→System Services(Run level);
2、在服务列表中选择vsftpd,点击下方的Enable按钮,启动服务,Finish。
注意,在启动vsftpd时可能会不能启动,有时是因为它所依赖的服务没有启动,如syslog,这时选中syslog,点击Enable按钮。如果还是不能启动,可以重新启动xinetd服务,然后再启动vsftpd服务。
re: pkg-config学习 Xiaobo Sun 2008-10-15 12:15
CC = gcc
all:
$(CC) `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello
re: Makefile example Xiaobo Sun 2008-10-09 15:08
如果你要传递变量到下级Makefile中,那么你可以使用这样的声明:
export <variable ...>;
export variable := value
其等价于:
variable := value
export variable
export variable += value
其等价于:
variable += value
export variable
re: Makefile example Xiaobo Sun 2008-10-09 14:07
看一个例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的
目标,也就是“foo.o bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取模
式“%.o”的“%”,也就是“foo bar”,并为其加下“.c”的后缀,于是,我们的依赖目标
就是“foo.c bar.c”。而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有的依赖
目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。于是,
上面的规则展开后等价于下面的规则:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就
可以写完一堆规则,实在是太有效率了
re: Makefile example Xiaobo Sun 2008-10-09 13:57
# macro
GSOAPPATH=../../
CCINCLUDE= -I$(GSOAPPATH)
#CCINCLUDE+= -I$(RESPONSEPATH)
CCFLAGS= -Wall -g
OBJECTS= soapServiceRequestIFSOAPService.o soapC.o stdsoap2.o \
soapServiceResponseIFSOAPProxy.o
# targets
all : server++ client++
server++ : server.cpp $(OBJECTS)
g++ $(CCFLAGS) $(CCINCLUDE) $^ -o $@
client++ : client.cpp soapC.o stdsoap2.o soapServiceResponseIFSOAPProxy.o
g++ $(CCFLAGS) $(CCINCLUDE) $^ -o $@
soapServiceRequestIFSOAPService.o : soapServiceRequestIFSOAPService.cpp
g++ -c $(CCINCLUDE) $^
soapC.o : soapC.cpp
g++ -c $(CCINCLUDE) $^
stdsoap2.o : $(GSOAPPATH)stdsoap2.cpp
g++ -c $(CCINCLUDE) $^
soapServiceResponseIFSOAPProxy.o : soapServiceResponseIFSOAPProxy.cpp
g++ -c $(CCINCLUDE) $^
clean :
rm -f server++ client++ *.o *~ *.swp
.PHONY : all clean
其实在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度.如果从以太网包返回来计算所加的长度,就嫌走弯路了.
另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度.
握手阶段:
序号 方向 seq ack
1 A->B 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0
2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001
数据传输阶段:
序号 方向 seq ack size
23 A->B 40000 70000 1514
24 B->A 70000 40000+1514-54=41460 54
25 A->B 41460 70000+54-54=70000 1514
26 B->A 70000 41460+1514-54=42920 54
解释:
23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包
24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。
25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。
26:一样的啊
ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t 指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u 以用户为主的格式来显示程序状况。
13)ps x 显示所有程序,不以终端机来区分。
最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。