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();
java网络编程
最新推荐文章于 2025-06-22 21:37:12 发布