Java中的Socket编程
来源:互联网 发布:搬家公司软件 编辑:程序博客网 时间:2024/06/05 02:25
UDP数据报连接:
DatagramSocket:
为UDP协议封装的类,创建一个DatagramSocket对象即建立一个套接字描述符,该套接字使用UDP协议即SOCK_DGRAM。构造函数可以指定绑定的本机端口,也可以指定绑定的本机IP,也可以通过Java封装的Socket地址对象SocketAddress创建新的实例。接收端如果在创建时不指定IP那么默认绑定本机所有ip,但必需指定一个port。发送端如果不指定port那么将由系统随机分配。
此类对象提供了网络套接字必要的 bind,close,connect,receive,send等方法。
DatagramPacket:
Java提供的套接字中receive与send功能不是直接操作于字节数组的,而是通过DatagramPacket对象对发送和接收到的数据包做处理。
DatagramPacket类对象可以看做是Java内置的封包类。可以通过构造DatagramPacket对象,将byte数组封包成一个将要发送的对象,并且在封装的同时指定该数据的长度,发送方的ip与port。接收的网络数据包也是以DatagramPacket对象的形式被提取的,
通过getSocketAddress,getAddress,getPort,getData,getLength一组get方法获取接收到包来源与内容。
通过setSocketAddress,setAddress,setPort,setData,setlength一组set方法设置发送包的去向与内容。
由于DatagramPacket类已将收发的数据包过滤,基本上杜绝了因网络故障产生的断包问题,所以Java中使用套接字完全避免了繁琐的拼包拆包过程,完全不用担心数据包的完整性,只需要在拆封DatagramPacket对象时对原byte数据做合法性校验即可。
至于DatagramPacket对数据包做了怎样的包装处理待以后有时间研究一下。
TCP数据流连接:
Java将TCP协议的server与clinet分别封装了,(真是能封的都封了,它就不考虑下那蛋疼的资源消耗吗?)。
ServerSocket专门用来创建server,Socket用于创建clinet。做过网络应用程序开发的朋友都知道,其实server与clinet的区别也就是前者多了一个侦听功能accept(),有必要封装两个类吗。
大眼瞄一下都有些什么功能吧。
Socket在构造的时候可以直接指定连接的服务器ip与port,参数backlog还可以指定最大连接数(是同时建立的socket连接数还是侦听队列的连接数这个因为机器性能原因没办法测试,但根据winAPI的经验来看这个是指的侦听队列)并且可以指定绑定的本机ip与port。如果在构造时使用空参数的构造方法,那么后续可以通过connect方法连接一个服务器,该方法还额外提供了连接超时值的功能。
啊!,我彻底被打败了,在Socket里没有发现,send与rece方法。而看到了getOutputStream与getInputStream。这意味着什么啊。不要太傻瓜式了好吧。
我该说什么好呢?好吧。什么封包拆包拼包断包的在Java看来都是浮云。来看看Java的TCP建立方式,cilnet三步搞定,server四步完成。
//创建服务端socket。serverSocket srvSock = new serverSocket(12580);//侦听连接请求,阻塞函数。Socket Sock = srvSock.accept();//创建客户端socket同时连接指定的ip与port。Socket Sock = new Socket("127.0.0.1", 12580); //获取Socket对应的输出流,使用os.write(buf)方法写入数据 OutputStream os = Sock.getOutputStream();//获取Socket对应的输入流,使用is.read(buf)方法读取数据,read为阻塞函数InputStream is = Sock.getInputStream();
InetAddress:
Java专门为IP地址做的封装类,即该类的一个对象,代表一个实际的IP地址。该类无法直接new出对象,但可以通过提供的一组静态函数获取该类的对象。
//通过指定的域名获取该域名下所有的IP地址,并封装成InetAddress对象返回,很牛吧。public static InetAddress[] getAllByName(String host)//使用指定的IP获取InetAddress对象,注意IP端大于127会被转成负数,看着好别扭。public static InetAddress getByAddress(byte[] addr)//通过域名获取,参数也可以为一个IP地址的字符串表现形式。public static InetAddress getByName(String host)//还能返回本机的public static InetAddress getLocalHost()
InetSocketAddress:
InetSocketAddress是SocketAddress抽象类的子类,该类为Java语法提供了专门服务于网络连接信息的数据结构。有点像C中的sockaddr_in结构体。但内容就没那么复杂了,仅仅只是一个ip与port的组合。
- Java中的Socket编程
- Java中的Socket编程
- java中的socket编程
- java中的Socket编程
- Java中的socket编程
- java中的socket编程
- 读懂Java中的Socket编程
- 读懂Java中的Socket编程
- 读懂Java中的Socket编程
- 读懂Java中的Socket编程
- 读懂Java中的Socket编程
- 读懂Java中的Socket编程
- 读懂Java中的Socket编程
- Java Socket编程中的一个秘密类
- Java Socket编程中的一个秘密类
- Java Socket编程中的一个秘密类
- java中的Socket编程简单例子
- Java socket编程中的日志处理
- 腾讯实习面试
- android 应用动态切换主题
- Mysql之数据库备份
- JavaScript程序设计
- OSGI环境下建立资源bundle
- Java中的Socket编程
- 转载分享移动网站最佳实践
- 准备正式开始我的职业生涯
- Ubuntu Linux 环境变量PATH设置
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
- 加速编码的17款最棒的CSS工具
- 常见P2P协议之BitTorrent 分析
- Oracle 获取当前日期及日期格式
- Java枚举enum