看完《java网络编程》的总结

最近看了,网络编程,感觉有必要总结一下自己认为要写下来的,加深一下影响




------------------------------------------------------------------------------------------------------------------------------------------------------------------



ip 网际层       tcp udp传输层        http,ftp应用层
防火墙工作于传输层或者网际层,但是代理服务器一般工作于应用层(socks代理服务器工作于传输层)

internet
安全性。从主机名创建一个心得InetAddress对象被认为是一个潜在的不安全操作。
如:getAllByName    getLocalHost   getByName
通过iP地址字节数组 :getByAddress 

检查一个主机是否可以解析:
int SecurityManager.checkConnect(String hostname, int port);



------------------------------------------我是分割线,上面是不知道自己怎么写的-------------------------------------------------

线程:
executor可以创建线程池,
从一个线程中获取数据会产生竞态,可以用很多方法解决,比如回调函数,判断,但是我还是觉得用join()方法比较简单

---------------------------------------------------------------------------------------------------------------------------------------

Internet地址:
inetAddress最重要的一个类,在这章中(对ip地址的高层表示,一般包括一个主机名,和ip地址)
有判断ipv6 ipv4的方法,有判断组播的方法。还有很多。

NetWorkInterface表示一个本地ip地址,表示物理硬件和物理硬件,可以看看书上的介绍,比较拗口。

---------------------------------------------------------------------------------------------------------------------------------------

URL和URI

URL

URI可以相当于一个借口,URL想到与一个具体实现的类。
URL的组成,这个自己应该知道,不知道可以看看书。

URL u1 = new URL("http://www.xxx.xxx/xxx/index.html");
URL u2 = new URL(u1,"newz.html");//和上面同目录下创建一个url资源

后面的URLConnection可以通过这里的openconnection方法得到

其他方法得到URL
File类有个toURL方法,这个file URL比较特殊,具体如果自己不记得的可以回到书来查询
通过类加载器获取 ClassLoader.getSystemResource(String name)返回一个URL,读取一个资源
ClassLoader.getSystemResources(String name)返回一个Enumeration

URL除了常用的两个比较相等以外还有  sameFIle比较是否为相等的资源。

toURI转为uri,和toExternalForm类似

URI

相对于URL和URN都是抽象可以用toURL方法变成url
URI u1 = new URI("http://www.xxx.xxx/xxx/");
URI u2 = new URI("images/newz.html");
URI resolved = u1.resolve("u2"); //和前面URL对比

URLEncoder.encode()对字符串完成URL编码。
而URLDecoder方法进行解码

//代理可以看看书是怎么代理的,还有访问口令保护的网站。

------------------------------------------------------------------------------------------------------------


HTTP协议
Connection:Keep-Alive重用socket,我感觉这个字段相当于socket池啊
HTTP方法中
主要有GET POST PUT DELET4个
还有几个是HEAD OPTIONS TRACE(回显客户端的请求来进行测试)

Cookie 字段Set-Cookie设置。当然servlet中也可以编程实现啦。

------------------------------------------------------------------------------------------------------------

URLConnection

URLConnection可以用POST,PUT和其他HTT请求方法向服务器发送数据,将处理协议的细节与是处理的特定数据类型分开,提供相应的接口,并完成完整web浏览器所完成的其他操作。这个还有很多获取HTTP字段的的方法。


用addRequestProperty(String ,String )可以添加一个新的HTTP字段
用setRequestProperty(String name,String value)修改字段

guessContextTypeFromName()方法可以猜测资源的MIME类型。这个不太准确,而使用guessContentTypeStream(InputStream in)通过流来猜测还比较好一点,但是这个流必须支持标记。

-------------------------------------------------------------------------------------------------------------------------

客户端socket

shutdownInput和shutdownOutput方法可以关闭连接的一般,半关闭Socket
两个构造还输指定链接的主机和端口
Socket(String host(InetAddress host),int port,InetAddress interface,int localPort)前面两个是目标主机的后面两个是自己的(选择从那个本地接口连接)

如果构造的时候没有传入目标主机地址,就不能连接这个时候必须通过socket.connect(InetSocketAddress address)来进行连接(后面还有很多中这个连接方式)

代理服务器
SocketAddress proxyAddress = new InetSocketAddress(String proxyhost,int port)
Proxy proxy = new Proxy(Proxy.Type.SOCKS,proxyAddress)//前面两步是代理服务器的
Socket s = new Socket(proxy);
SocketAddress remote = new InetAocketAddress(String host,int port);
s.connect(remote);这个是链接服务器的

检查scoket关闭还是链接需要用isBound和isConnectes方法同时使用才正确。
Socket字段挺多的可以直接看下书,多大还是很有用的
GUISocket这部分没看。

----------------------------------------------------------------------------------------------------------------------------------
服务器Socket
可以使用前面提到的线程池来使用多线程服务器。
服务器无参书使用
ServerSocket server = new ServerSocket();
SocketAddrrss address = new InetSocketAddress(port);
servet.bind(address)//看清楚和前面客户端的区别
//同时判断是否关闭也是和客户端一样的方法

-------------------------------------------------------------------------------------------------------------------------------

安全Socket

客户端
SocketFactory factory = SSLSocketFactory.getDefault();
Socket socket = factory.createSocket(String host,int port);//当然createSocket()里面的参数远不止这些。不清楚可以看看书。这样就有一个安全的socket了

密码组
SSLSocketFactory中的gerSupportedClipherSuites可以指定给Socket上可用的算法组合。
通过setEnabledCipherSuites(String[] suites)(里面参数不止这些)修改客户端易用的密码组密码组很多,想用可以来查查书。
想要在无认证的食物或认证但是不加密的事务,必须使用setEnabledCipherSuites显示启动密码组//JDk1.7默认启用了所有的密码认证组

服务器
SSLContext Context = SSLContext.getInstance(String algorithm)//书上例子里面写的“SSL“,一个算法
SSLserverSocketFactory factory = context.getServerSocketFactory();
SSLServerSocket server = (SSLServerSocket)factory.createServerSocket(string port);
其他和客户端类似

---------------------------------------------------------------------------------------------------------------------------------------


非阻塞I/O(合理构建的非阻塞I/O远远胜过多线程、多进程的设计)

服务器ServerSocketChannel(只有一个目的:接受入站连接)
一般通过Buffer对象(缓冲区,如果不懂,多看看api文档)传递数据。
为了让ServerSocketChannel处于非阻塞的模式,需要在调用accept之前调用configureBlocking(false)。

通过selector来进行操作多个客户端的连接。

客户端SocketChannel
大致技巧和前面那些差不多。

Channels类是一个简单的工具类,里面有一些方法可以从通道转换为流、阅读器、书写器。

异步通道(java 7)
主要是AsynchronousSocketChannel和AsynchronousServerSocketChannel类。他们和SocketChannel、ServerSocketChannel用法类似。这个比较厉害读/写异步通道会立即返回,在I/O完成之前就会返回。connect()和accept()方法也会异步的执行,并且返回Future。具体例子见书374页。很牛逼的异步通道。里面重点是Future这个对象。

------------------------------------------------------------------------------------------------------------------------------------------

UDP协议

两个重要的类(DatagramPacket和DatagramSocket类)//居然服务器和客户端都用一个类,而且大多数东西东部报错,看来真的不可靠啊。
udp客户端代码事例:(借鉴书上)
 try (DatagramSocket socket = new DatagramSocket(0)) {
      socket.setSoTimeout(10000);
      InetAddress host = InetAddress.getByName(HOSTNAME);
      DatagramPacket request = new DatagramPacket(new byte[1], 1, host , PORT);
      DatagramPacket response = new DatagramPacket(new byte[1024], 1024);
      socket.send(request);
      socket.receive(response);
      String result = new String(response.getData(), 0, response.getLength(), "US-ASCII");
//这里与TCP不同的是通过数据报传输数据,而不是流。

UDP服务器(书上有很多UDP服务器例子)
代码列子(借鉴书上)
         DatagramSocket socket = new DatagramSocket(PORT)
         DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
          socket.receive(request);

          String daytime = new Date().toString();
          byte[] data = daytime.getBytes("US-ASCII");
          DatagramPacket response = new DatagramPacket(data, data.length,  request.getAddress(), request.getPort());
          socket.send(response);


DataGramChannel
和前面的TCP类似用法。
DataGramChannel还分别有三个一般的read,write方法。在调用之前必须用connect连接到一个远程主机

-------------------------------------------------------------------------------------------------------------------------------------

IP组播(前面是一对一,这个事一对多)
组播数据一般通UDP发送,
组播和使用正常的USPSocket之间最重要的区别就是在于你必须考虑TTL值。
创建例子
         InetAddress  ms = new MulticastSocket(port);
        ms.joinGroup(group);
         byte[] buffer = new byte[8192];
          DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
          ms.receive(dp);
          String s = new String(dp.getData(), "8859_1")
-------------------------------------------------------------------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值