`

java networking

    博客分类:
  • java
 
阅读更多

fundamental networking in java:
1.summary
用java开发网络编程应用优势在于:
1.跨平台型
2.轻量级线程模型  网络编程跟多线程结合
3.安全性 没有指针,垃圾回收机制;很好的异常处理机制,oom异常也能捕获;未捕获的运行时异常只影响所在的线程,不影响进程。
4.可扩展性灵活性,以及良好丰富的类库。java的网络库更简单易用。

2 IP:
Socket:一台机器的通讯节点称为socket,在java中,socket是java.net包里面的Socket,ServerSocket,DataGramSocket,MultiSocket的实例。
IP地址java中用java.net.InetAddress来表示。
java network address class包括:
InetAddress:ip地址或者域名,指向远程地址。如果域名解析不了,则出错。
           抽象类,有两个子类:Inet4Address和Inet6Address。这两个类智能通过InetAddress的静态方法获取,不能直接构造。包可见。
InetSocketAddress extends SocketAddress:ip socket地址,用{ip,port}或者{hostname,port}表示。也能够单独用port构造,表示本机ip地址,所有本机网络地址。
NetwordInterface:本机网络接口,由多个网络接口名称和对应的网络接口的ip地址列表构成。

网络主机有两个特殊的网络地址:
loopback:127.0.0.1  用来检测本机的host名称,或者检测本地ip地址是否可用
wildcard:0.0.0.0 绑定了本机所有的ip地址

IPV6支持IPV4,可以通过以下的环境变量对ipv4和ipv6进行设置
java.net.preferlPv4Stack  false(default)/true  false:表示支持ipv4heipv6,true表示只支持ipv4,
java.net.preferlPv6Address  false(default)/true  false,如果ipv6可用,则ipv4地址会覆盖掉ipv6地址,如果为true,则ipv6会覆盖ipv4地址,通讯地址使用ipv6.

3.TCP: 可靠的,基于流的连接,双向的
 两种TCP socket:active和passive(listening)  
serversocket:create a socket->binds to a port -> listen() -> loop accepte client connect -> read/write
client socket:create a socket -> connect to a address -> read/write


连接:三次握手:最多重试三次,第一次3-6s,后面double。
关闭连接:四次握手

server socket:
  如果port设置为0,不设置,则系统会自动分配一个端口。如果设置为1-1023端口,需要高级用户权限。
  backlog:请求队列最大长度,服务器端等待请求的最大队列数。默认50.
  localaddress:server监听的本机地址,默认是所有的。
    setReuseAddress(boolean on):如果停止服务之后,需要马上重启服务,那么之前的端口可能还占用导致启动不了。设置该参数表示该地址可以重用。
    setReceiveBufferSize (int size):设置接收缓冲区大小。必须在绑定端口之前设置。为了达到更大的吞吐量,可以设置得大一点(>64k)。但是跟sendBufferSize最好配合使用。
client socket:
  如果port不设置,则默认跟连接的server一致。 
  setSendBufferSize(int size)必须在connect之前设置

   Socket IO:
DataOutputStream DataInputStream  ObjectInputStream ObjectOutputStream

可能导致死锁:下面两行代码顺序可能导致死锁,因为server和client的ObjectInputStream都尝试读取对方的object stream header的数据,这样导致server和client都在等待,处于死锁。获取ObjectOutputStream必须在获取ObjectInputStream之前。
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());

InputStream.available()获取当前socket buffer的大小。

channel IO:

output shutdown:半关闭 
class Socket
{
void shutdownOutput() throws IOException;
boolean isOutputShutdown();
}
特点:1.可读不可写;2.当socket关闭时,会close该连接。3.另一端read时会得到EOF异常
在proxy中,copy input to output时需要close output,这样才能把代理端的EOF也复制。如果不需要read操作,可以关闭output,减少reply数据的计算和传输的资源。

Socket.close()异步操作

input shutdown:半关闭
class Socket
{
void shutdownInput() throws IOException;
boolean isInputShutdown();
}
特点:1直接丢弃数据,远程端无法感知本地已经关闭input。

close a connected socket:
class Socket
{
void close() throws IOException;
boolean isClosed();
}
1.socket.close() 2 socket.getOutputStream().close(); 3 socket.getInputStream().close();
   
close a server socket:
class ServerSocket
{
void close() throws IOException;
boolean isClosed();
}

socket factory:
java 提供三种socket factory:
   java.net socket factory:SocketImplFactory  Socket类的public static synchronized void setSocketImplFactory(SocketImplFactory fac)只能在一个jvm中调用一次,需要RuntimePermission ‘setFactory’
   RMI socket factory:RMISocketFactory  RMIServerSocketFactory RMIClientSocketFactory
   ssl socket factory.

socket:sendbuffer和receivebuffer的大小由tcp协议栈决定,不是由jvm。传统的tcp实现默认是2kb,但是现在更多的如28kb,32kb,64kb。

1.以太网最好从4kb增大到16kb  >=3 * MSS sendbuffer>=receivebuffer
2.如果应用读取数据很慢,那么receivebuffer要设置得大一点,避免阻塞sendbuffer。
3.应用程序如果要发送也要接受大量数据,则需要增加这两个值。
4.java中最好使用bufferoutputStream或者ByteBuffer,来写入足够数据的TCP块。

//立刻发送urgentdata的数据,而write的数据要flush之后才发送。server和client都要同时开启。
   socket.setOOBInline(true);  
socket.sendUrgentData(65); 

   public void setTrafficClass(int tc) 
   * <UL>
     * <LI><CODE>IPTOS_LOWCOST (0x02)</CODE></LI>
     * <LI><CODE>IPTOS_RELIABILITY (0x04)</CODE></LI>
     * <LI><CODE>IPTOS_THROUGHPUT (0x08)</CODE></LI>
     * <LI><CODE>IPTOS_LOWDELAY (0x10)</CODE></LI>
     * </UL>


       If the
     * application prefers short connection time over both low latency and high
     * bandwidth, for example, then it could invoke this method with the values
     * <tt>(1, 0, 0)</tt>.  If the application prefers high bandwidth above low
     * latency, and low latency above short connection time, then it could
     * invoke this method with the values <tt>(0, 1, 2)</tt>.
 public void setPerformancePreferences(int connectionTime,
                                          int latency,
                                          int bandwidth)

scaable IO:

channel create:
FileChannel FileInputStream.getChannel();
FileChannel FileOutputStream.getChannel();
FileChannel RandomAccessFile.getChannel();

SocketChannel channel = SocketChannel.open();
Socket socket = channel.socket();

ServerSocketChannel channel = ServerSocketChannel.open();
ServerSocket serverSocket = channel.socket();

DatagramChannel channel = DatagramChannel.open();
DatagramSocket datagramSocket = channel.socket();

//
Pipe pipe = Pipe.open();
Pipe.SinkChannel sinkChannel = pipe.sink();
Pipe.SourceChannel sourceChannel = pipe.source();

Stream和channel的转换:Channels.java
//not buffered,not support mart/reset operation;thread safe;only be use in blocking mode;closing them cause the underlying channel to be closed;
class Channels 
{
// convert streams to channels
static ReadableByteChannel newChannel(InputStream is);
static WritableByteChannel newChannel(OutputStream os);
// convert channels to streams
static InputStream
newInputStream(ReadableByteChannel ch);
static OutputStream
newOutputStream(WritableByteChannel ch);
}

selector的select方法:如果返回0,则可能超时selector被异步唤醒;a register key被异步取消。 
selectkey set只有在调用select(),select(long timeout)才被更新,处理完之后需要显示remove掉已经处理过得selectkey。
selector.wakeup() will cause的next first block return immediately。wakeup():set a boolean status

blocking TCP connect():connect() ilock
noblocking TCP connect():cnnect() return true immediately,finishConnect() to check connect is ok.isConnectionPending() and finishConnect() only user in noblocking mode.

socketChannel.close();1.cannel the selectkey associated with the channel;2 channel.close();must invoke selector.selectNow();
1.only use OP_CONNECT on unconnect socket;it must be removed from keys as soon as channel is ready;2.only use OP_WRITE on connect socket;


firewalls:1.transport firewalls;2application firewalls.
HTTP proxy server:java 能够通过设置环境变量http.proxyHost和http.proxyPort通过代理服务器发送http请求。to get http tunnelling in rmi or httpConnect.
Socket proxy:socksProxyHost and socksProxyPort to user a socket proxy 
java.net.Proxy:

secure socket
handShake protocal:
SSlSocket:1.firest create take more time;2use bufferOutputStream;3 not support OOBinline;4.SSlSocket.getInputStream().available() always return 0. 
          5.serveer/client must close at the same time,not support shutdownInput or shutDownoutput

(a) To view all debugging messages:
-Djavax.net.debug=all
(b) To view the hexadecimal dumps of each handshake message: 
-Djavax.net.debug=ssl:handshake:data
(c) To view the hexadecimal dumps of each handshake message, an
trust manager tracing (the commas are optional):
-Djavax.net.debug=SSL:handshake:data:trustmanager

SSL system properties:
https.cipherSuites
https.protocals
https.proxyHost
https.proxyPort
java.net.protocal.handler.pkgs
javax.net.debug
javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword
javax.net.ssl.keyStoreType
javax.net.trustStore
javax.net.trustStorePassword
javax.net.trustStoreType

scalable secure socket:
javax.net.ssl.Sslengine

unicast UDP:

ipv4 65507byte
udp:512byte a ip package size
udp:没有建立连接和关闭连接的开销;服务器和客户端管理简单;
a:trasaction is request-reply;b:payloads is small;c:servers are stateless;d:Trasactions can be repeated;
receive, send is synchronized

reliable UDP:(DNS)
  1.sequence number; 2 timeout and retransmits

ACK and NACK based protocol

scalable UDP:

muliticast UDP:

1. multicast address a dynamic group address
   resuce the load;receive the package almost at the same time;fesable;
   reliable;co-operation from routers;security;
2. broadcast a static group address
3. IPV6 anycast only receive by any one of the group members

TTL based Scopes


Address based Scopes

Tree-based protocals
NACK-based protocals
ACL

Reactor,Proactor,leader-follower server
 
1
0
分享到:
评论

相关推荐

    Advanced JAVA Networking.pdf(2nd Edition)

    ### 关于《Advanced JAVA Networking.pdf(第二版)》的关键知识点 #### 一、Java网络编程的重要性及优势 在《Advanced JAVA Networking.pdf(第二版)》中,作者首先强调了Java不仅仅是一种用于创建网页动画(如...

    JavaNetworking.pdf 英文原版

    Java Networking

    Java Networking and AWT Bible

    《Java Networking and AWT Bible》是一本深入探讨Java网络编程和AWT(Abstract Window Toolkit)图形用户界面库的权威指南。这本书旨在帮助开发者理解和利用Java平台的网络功能以及构建丰富的图形用户界面。以下是...

    Java Networking and Proxies Code

    本文将详细解析"Java Networking and Proxies Code"这一主题,包括如何启动一个线程来检查URL是否通过代理以及如何获取代理的详细信息。 首先,让我们了解一下Java中的网络编程基础。Java提供了`java.net`包,该包...

    JAVA NETWORKING

    JAVA NETWORKING分分钟轻松掌握,你就是未来的编程大拿

    Java Networking Overview

    ### Java Networking API 概览 #### 一、引言 Java Networking API(`java.net`包)为开发者提供了丰富的接口和类,支持多种网络通信功能,包括但不限于地址处理、TCP连接建立、通过UDP发送接收数据报包、定位及...

    Advanced JAVA Networking

    First and foremost, it presents each Java networking API with real intelligence and enthusiasm. The authors of the second edition (who have revised the book thoroughly) prove they have considerable ...

    java networking 网络编程

    java 网络编程 html格式java 网络编程 html格式java 网络编程 html格式java 网络编程 html格式java 网络编程 html格式java 网络编程 html格式

    advanced java networking

    ### 高级Java网络编程概览 #### 一、引言与背景介绍 在过去的几年里,Java作为一种新兴的编程语言迅速崛起,并以其强大的功能、易用性以及跨平台特性吸引了大量的开发者。尽管如此,大多数开发者依然倾向于使用C或...

    Advanced Java Networking

    # 高级Java网络编程详解 ## 引言与背景 在深入了解《高级Java网络编程》之前,我们先简要回顾一下Java的历史及其在网络编程领域的重要性。Java自诞生以来就被视为互联网时代的一种语言,它以其跨平台性、安全性...

    Fundamental Networking in Java

    ### 基础网络编程在Java中的应用 #### 核心知识点概述 本文将深入探讨《基础网络编程在Java中》这一主题所涵盖的核心概念和技术。本书填补了Java编程语言和平台在网络编程方面长期存在的文档空白,提供了从Java ...

    Java.7.A.Comprehensive.Tutorial

    Chapter 21 Java Networking Chapter 22 Java Database Connectivity Chapter 23 Java Threads Chapter 24 Concurrency Utilities Chapter 25 Security Chapter 26 Java Web Applications Chapter 27 JavaServer ...

    学习java必看的书籍

    根据提供的部分信息,我们将重点介绍三本被广泛推荐的经典Java书籍:《Thinking in Java》、《Java Collections》以及《Java Networking Programming》,并简要提及其他几个方面如数据结构、Web开发和设计模式等。...

    AdvancedJavaNetworking.pdf 英文原版

    Advanced Java Networking

    中科大软件学院java学习资料

    - **1_5 Java Networking**: 这部分可能介绍Java如何进行网络通信,包括Socket编程、URL类、HTTP协议的实现,以及数据的序列化和反序列化。 6. **Java平台与J2EE** - **3_1 J2EEOverview** 和 **3_2 Java EE 5 ...

    High Performance Browser Networking

    《高性能浏览器网络》是一本深度探讨Web和互联网通信技术的专业书籍,对于从事Web开发和互联网相关工作的人员来说,是不可或缺的参考资料。... ... ...服务器推送技术让服务器能够预发送资源,进一步优化用户体验。...

Global site tag (gtag.js) - Google Analytics