java网络编程

IP地址如192.166.3.4包含了两部分,一是主机地址也就是192.166.3.4,另一部分是网络(子网)的地址。如何确定子网的地址呢?这就需要用到掩码,将掩码与IP地址进行&操作,得到的结果就是子网地址。假设掩码为255.255.255.0,那么子网地址就是192.166.3.0,如果掩码为255.255.0.0那么子网地址就是192.166.0.0。注意掩码总是左边为1,右边为0。

TCP/IP四层模型:
应用层: FTP TELNET HTTP, SNMP DNS
传输层: TCP, UDP
网络互联层: IP
主机-网络层:以太网,令牌环网

TCP(可靠传输)和UDP(非可靠传输)的端口是互相独立的,互不干扰。

最简单的server和client程序:见第一章代码EchoServer.java和EchoClient.java

server
使用ServerSocket类。
ServerSocket server = new ServerSocket(8000);
然后不断检查是否有客户端发来的socket:
while(true) {
try { Socket socket = server.accept(); ....}
}
accept方法会一直阻塞,直到有客户端连接为止。
一旦获取了socket,就可以通过socket的I/OStream,进行读写。
ServerSocket可以设置尚未处理的socket队列的最大长度。

客户端
创建连接
Socket socket = new Socket("localhost",8000);//"localhost"或"127.0.0.1"表示本机
然后便可以使用I/OStream进行读写
客户端的端口由操作系统随机分配。
Socket的IOStream关闭并不意味着Socket的关闭,因为端口等资源还在占用着。
Socket调用close时,底层的socket可能要延迟一段时间,处理完剩下的数据才关闭;同时如果一个新启动的程序想要绑定到此端口将会失败。可以通过setReuseAddress、getSoLinger来进行设置。还可设置服务类型setTrafficClass,如低成本、高可靠性、高吞吐量、最小延迟。

Socket使用TCP传输

各种协议的详细描述见RFC

InetAddress类提供了很多有用的静态方法用于创建和解析IP地址。

第三章 ServerSocket
ServerSocket一般使用固定端口,但也可能使用匿名端口。比如ftp服务,会使用两个tcp连接,一个为控制连接,一个为传输连接,传输连接就有可能使用不固定端口。

创建多线程服务器: 可以为每一个客户连接建立一个线程,使得客户之间无需等待。使用Excutors类提供的各种线程池。

关闭服务器:直接ctrl+c关闭的话,会导致尚未处理完的任务中断,应该通过一个单独的线程来发送控制命令。在服务器程序中简历两个ServerSocket,监听不同的端口,一个负责处理客户连接(1),另外一个负责处理控制命令(2)。ServerSocket(2)接收到一个shutdown命令时,便会将线程池设为不再接收新任务,并且等待目前任务处理完之后关闭服务器。 当然,还需要一个AdminClient的程序,负责与ServerSocket(2)建立socket连接,并发送命令。

编码和解码
编码
Charset charset = Carset.forName("GBK");
ByteBuffer buf = charset.encode("hello");
解码
CharBuffer cbuf = charset.decode(buf);
String s = cbuf.toString();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值