-
- 2.1. udp通信程序
网络编程
网络编程三要素
- ip
- 端口
- 协议
1. InetAddress类
这个类可以提供主机名和ip地址之间的转换。
使用其静态方法getByName来构造一个对象,方法中提供一个主机名
1 | InetAddress byName = InetAddress.getByName("hjzboss"); |
然后就可以使用这个对象中的方法来获取主机名和ip地址
1 | String hostName = byName.getHostName();//获取主机名 |
2. 协议
这里的协议指传输层协议,包括
- udp协议,提供不可靠,无连接服务
- tcp协议,提供有链接,可靠无差错服务
udp协议虽然不可靠,但是无须建立连接和进行拥塞控制,传输起来效率高,速度快,一般用于音频和视频的传输。
tcp需要进行三次握手建立连接,提供可靠无差错服务,但是也降低了效率,一般用于文件的下载,网页的访问等等。
2.1. udp通信程序
使用udp发送数据的步骤
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据并打包(数据包对象),要指定目标地址和端口
- 调用DatagramSocket对象的方法发送数据(send)
- 关闭发送端
1 | DatagramSocket socket = new DatagramSocket();//创建套接字 |
使用udp接受数据的步骤
- 创建Socket对象(需要绑定端口号)
- 创建数据包对象用于接受数据
- 调用DatagramSocket对象的方法接受数据(receive)
- 解析数据包(getData)
- 关闭接受端
1 | public class udpServer { |
3. tcp通信程序
与udp数据包格式的传输不同,tcp是以流来传输数据的
使用tcp发送数据的步骤
- 创建客户端的Socket对象(Socket)
- 创建输出流写数据(getOutputStream)
- 释放资源
1 | public class tcpClient { |
使用tcp接受数据的步骤
- 创建服务器端的Socket对象(ServerSocket)
- 获取输入流,读取数据
- 释放资源
1 | public class tcpServer { |
注意:
- socket.shutdownOutput();方法可以发送一个传输结束的信号给接收端。在上面的例子当中,如果不通知结束,接受端会一直在等,不会给发送端发送反馈。
- 服务器端需要绑定一个监听端口,一旦收到连接请求便创建一个新的套接字来进行传输
- tcp发送端的套接字一开始就要提供目的主机的地址和端口号,和udp不同
- 需要使用Socket对象来获取tcp的输入和输出流
tcp也可以用来传输文件,只要将上述的输入流指向文件即可。
4. tcp多线程
可以使用多线程来传输文件,客户端和以前一样,变化的只有服务器端
服务器的思想是每接受到一个请求就为其创建一个套接字,然后传递给实现了Runnable接口的对象,开启线程。
还需实现一个实现了Runnable接口的类,具体方法都实现在run方法中
1 | public class ServerThread implements Runnable { |
服务器的代码很简单
1 | /*多线程服务器*/ |