有关Java socket的积累
来源:互联网 发布:linux查看目录空间 编辑:程序博客网 时间:2024/05/21 06:43
现在大四了,这几天浑浑噩噩过了几天,没有什么长进,这不今天也照样快睡了整个上午了,不过在熟睡的时候我也没有停止思考,还在想我的前途,我的java(其实是大家的)。
回忆接触java这是第三年吧,中间又是学这个那个的,把我搞晕了,是因为不如别人有魄力该干自己的干自己喜欢的就ok,而我来学着这个想这那个,真是龌龊,所以java掌握的也就没有那么扎实,不过现在让我实现什么功能还是没有问题滴。
第一次接触java时时大专要毕业的那年,在宋武老师的指导下很快的时间完成了一个TSP算法的导航,呵呵其实蛮有成就感的(见笑),没有socket这东西。可到现在为止对socket仍是迷糊万分啊。今天我只是想坐下来把这个问题搞透彻了。
1、到底什么是socket?
socket是计算机提供的一个端口,不同计算机之间可以通过socket建立通信连接。
2、socket又分为两类:(1)Datagram 数据包socket (2)stream socket
2.1数据包socket采用采用UDP协议来实现通信,不能确保数据一定到达目的地,因此他不需要专用的网络连接通道,占用资源较少。
Java通过两个类DatagramSocket和DatagramPacket来支持Datagram socket。DatagramSocket实现了Datagram socket的基本功能,而DatagramPacket则提供了对包的一些支持。
DatagramSocket的几个重要方法:
(1) DatagramSocket():随机绑定一个有效的端口;
(2) DatagramSocket(int port):绑定指定的端口;
(3) Void send(DatagramPacket p):发送数据报,由于目的地的地址信息已包含在数据报中,所以不需要在本函数中提供地址信息;
(4) synchronized void receive(DatagramPacket p):接收数据包,线程安全;
(5) synchronized void close():关闭socket;
在DatagramSocket中并不区分ServerSocket和ClientSocket,如果一定要区分,那么发送的是client,而接收的是server。
2.2以下是完整的Datagram Socket的例子:
server端:
注意:(1)本例子的关键函数是run,它使用了死循环,在循环中使用了receive这方法来临听1114端口,如果1114端口没有请求数据到来,那么这个程序就一直停留在receive这个位置,不再往下执行
(2) 当1114端有数据时,receive方法将接收到的DatagramPacket数据包放在packet这个对象中,然后解析其中的数据,获取发送方的地址信息;
(3) 然后再创建DatagramPacket包,并填充数据,发送到原接收端。
client端:
2.2 stream socket实现
Stream Socket可以确保数据可靠的发送到对方。但是Stream Socket所占的资源更多。
Java主要通过Socket及ServerSocket来实现Stream Socket,一个用于客户端,另一个用户服务器端。
Socket类的几个重要方法如下:
(1) Socket(String host, int port)
(2) Socket(InetAddress address, int port)
(3) synchronized void close()
(4) InputStream getInputStream()
(5) OutputStream getOutputStream()
可以看出Stream Socket中的Socket与Datagram Socket中的Socket的区别:
(1) 在构造函数中,这里需要指定服务器的地址与端口,用于它发送数据之前建立链接,而Datagram的Socket不需要建立链接,它仅需要在要发送的数据包中包含地址信息即可;
(2) Stream Socket的两个重要方法和其它流的方法类似,而且在操作上也相似,其实在操作Stream Socket时,只要建立了链接,那么以后的操作和流的操作一样了,你可以忘了你在操作Socket,只当做自己在操作普通的流。
ServerSocket有以下几个重要的方法:
(1) ServerSocket(int port):监听指定端口,监听时间为默认值50;
(2) ServerSocket(int port, int count):监听指定端口,并指定监听时间;
(3) ServerSocket(int port, int backlog, InetAddress bindAddr):只接收指定接口发过来的数据;
(4) Socket accept():accpet方法会返回一个Socket对象,使用该Socket对象的getInputStream及getOutputStream方法获取输入及输出流。由此可见无论是服务器端还是客户端,它们都是通过Socket对象来收发数据的。程序执行到accpet时会进入监听状态,不再向下执行一直到接收到数据。
(5) void close()
详细出处参考:http://study.qqcf.com/web/264/35185.htm
- 有关Java socket的积累
- java中socket有关书籍的阅读
- 一些有关银行的英文单词的积累
- 有关内存的思考题(积累中)
- 有关matlab的一些积累,持续更新
- 有关Android国际化的一点积累
- 【socket】有关socket的编程<一>
- 【socket】有关socket的编程<二>
- 【socket】有关socket的编程<三>
- 有关socket数据传输的函数
- 有关于socket的疑惑
- JAVA路上的积累
- H5有关积累
- 积累有关.so文件在Android中使用的方法:
- Android 积累一些RxJava2.0有关的知识
- 处理粘包和半包有关问题的socket分包Java实现
- 与socket有关的一些函数
- 与socket有关的一些函数介绍
- wpf中ListView排序
- 盛网虚拟主机先试用后付款
- 基于有序HASH树SDK应用---前缀规则匹配
- 课程 1: 开始使用ER/Studio
- HRESULT: 0x800A03EC -----当EXCEL单元格处于编辑状态时
- 有关Java socket的积累
- 大家看看这个错误怎么解决 。。。搞了我半天
- 软件开发相关知识体系
- sql server系统表详细说明
- MSSQL 字符段分段更新
- sdf
- [转]C/C++ 数据对齐知识摘要
- 8位世界级巨富教子秘笈
- COM 组件设计与应用(一)