有关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

 

原创粉丝点击