socket编程
1,计算机进行通信编程的基础是有ip地址加端口号的主机唯一标示、有相应的一致的协议即tcp/ip。ip地址用来区分主机,端口号用来区分计算机上不同的应用软件。
2,java提供的网络功能主要有四大类
1)InetAddress类,封装ip地址代表网络上的硬件资源。
2)URL,统一资源定位符
3)Sockets:使用tcp协议实现网络通信的Socket相关类
4)Datagram:使用udp协议,将数据保存在数据报中通过网络进行通信的相关类。
3,InetAddress类
该类需要通过静态方法InetAddress.getLocalHost()得到实例。 提供了得到主机名,ip地址等的方法,具体可查api文档。该类可以得到本地主机和远程主机的相关硬件信息。
4,URL类
类似这种的字符串叫url,利用该类可以得到url中的各种详细信息,见代码:
5,Socket类和ServerSocket类实现tcp连接
基本原理是通过ServerSocket启动监听程序,Socket发起请求建立连接,并通过绑定在两个对象上的InputStream,OutputSteam流来交换数据。
练习实例思路:
1)建立服务器端监听程序并绑定端口,ServerSocket serverSocket = new ServerSocket(8888); 循环监听程序,若有accept() 方法监听到客户端连接,建立socket连接,并启动响应线程。
2)建立客户端程序,向服务器发送连接请求。Socket socket=new Socket("localhost", 8888);得到此socket上的输出流,并封装成打印流,向服务器发送字符消息。
3)编写服务器端响应的多线程处理程序ServerThread,此类为自己编写非api,使用服务端建立的套接字通道,接收客户端数据,并根据内容回复。
总结: 1)ServerSocket的accept方法得到连接后返回一个Socket对象,即为对等客户端的连接通道。服务端会有很多Socket对象。
2)服务器端需要一个实现多线程的处理类,来并发的处理多个客户端的请求。
3)代码详见程序。
6,通过DatagramPacket、DatagramSocket类实现UDP通信。
其中DatagramPacket表示udp通信的数据报类,通过构造方法可以将通信信息和要发送的地址保存到类中;DatagramSocket表示一次端到端的通信,传入DatagramPacket信息,DatagramSocket的send方法表示发送。receive方法表示接收,并且是阻塞式的在得到数据报发入前不会进行任何操作!
7,整体总结
1)不管是tcp还是udp服务器端肯定需要多线程,要注意设置线程优先级提高性能。
2)tcp中,关闭了socket中的输出流,则socket也关闭了,因此,可在连接中不关流,在确定没有输出输入的时候再关闭socket;
3)可不传输字符串,而使用ObjectInputStream和ObjectOutputStream传输对象
4)结合io流的基本用法,可以用通讯类在不同的机器间发送文件。
5) 两个协议实现中receive方法和accept方法均为阻塞式的。