Java第二十一章总结
网络编程三要素
ip地址:计算机在网络中的唯一标识
端口:应用程序在计算机中唯一标识
协议:通信协议,常见有UDP和TCP协议
InetAddress类
表示Internet协议地址
? ? ? ? //返回InetAddress对象
? ? ? ? InetAddress byName = InetAddress.getByName("DESKTOP-1ET1T7L");? ? ? ? //返回计算机名
? ? ? ? String hostName = byName.getHostName();? ? ? ? //返回Ip地址
? ? ? ? String hostAddress = byName.getHostAddress();
端口
端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被占用,会导致程序启动失败
协议
计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议
?用户数据报协议(User Datagram Protocol)
?UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
?UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
TCP协议
?传输控制协议 (Transmission Control Protocol)
?TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
?在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”
三次握手:
??第一次握手,客户端向服务器端发出连接请求,等待服务器确认
??第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
??第三次握手,客户端再次向服务器端发送确认信息,确认连接
UDP发送数据
Java提供了DatagramSocket类作为基于UDP协议的Socket
构造方法
?相关方法
?? ??? ?//创建一个发送数据Socket对象
? ? ? ? DatagramSocket ds=new DatagramSocket();
? ? ? ? //创建一个包,用于存放要发送的数据
? ? ? ? byte[] bys="hello".getBytes();
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),8888);
? ? ? ? //发送数据
? ? ? ? ds.send(dp);
? ? ? ? ds.close();
? ? ??
?
UDP接受数据
构造方法
方法名 | 说明 |
---|---|
DatagramPacket(byte[] buf, int len) | 创建一个DatagramPacket用于接收长度为len的数据包 |
相关方法
? ? ? ? //创建一个接收端的Socket对象
? ? ? ? DatagramSocket ds=new DatagramSocket(8888);
? ? ? ??
? ? ? ? //创建一个接受数据的包
? ? ? ? byte[] bys=new byte[1024];
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length);
? ? ? ??
? ? ? ? //接收数据
? ? ? ? ds.receive(dp);
? ? ? ? //获取数据
? ? ? ? byte[] data = dp.getData();
? ? ? ? //dp.getLength是接受到的数据长度
? ? ? ? System.out.println(new String(data,0,dp.getLength()));
?? ??? ?ds.close();
?
UDP三种通讯方式
单播:两个主机之间的端对通信
组播:对一组特定的主机进行通信
广播:一个主机对整个局域网所有主机通信
组播代码实现:
//发送端
?? ??? ?//创建发送端的Socket对象
? ? ? ? DatagramSocket ds=new DatagramSocket();
? ? ? ? //创建数据包,
? ? ? ? byte[] bys="hello".getBytes();
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("224.0.1.1"),8888);
? ? ? ? //发送
? ? ? ? ds.send(dp);
? ? ? ? //释放资源
? ? ? ? ds.close();
? ? ? ??
//========================================================
//接收端? ? ? ? //创建一个接收端的Socket对象
? ? ? ? MulticastSocket ms=new MulticastSocket(8888);
? ? ? ? //创建一个接受数据的包
? ? ? ? byte[] bys=new byte[1024];
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length);? ? ? ? //把当前电脑绑定一个组播地址
? ? ? ? ms.joinGroup(InetAddress.getByName("224.0.1.1"));? ? ? ? //接收数据
? ? ? ? ms.receive(dp);
? ? ? ? //获取数据
? ? ? ? byte[] data = dp.getData();
? ? ? ? //dp.getLength是接受到的数据长度
? ? ? ? System.out.println(new String(data,0,dp.getLength()));
? ? ? ? ms.close();
TCP发送数据
客户端用用Socket类,
服务器端用ServerSocket类
Socket构造方法
相关方法方
? ? ? ? //创建一个客户端Socket对象
? ? ? ? Socket s=new Socket("127.0.0.1",8888);
? ? ? ? //获取输出流,输出数据
? ? ? ? OutputStream outputStream = s.getOutputStream();
? ? ? ? outputStream.write("hello".getBytes());
? ? ? ? //释放资源
? ? ? ? s.close();
?
TCP接收数据
构造方法
方法名 | 说明 |
---|---|
ServletSocket(int port) | 创建绑定到指定端口的服务器套接字 |
相关方法
方法名 | 说明 |
---|---|
Socket accept() | 监听要连接到此的套接字并接受它 |
? ? ? ? //创建服务器端ServerSocket对象
? ? ? ? ServerSocket ss=new ServerSocket(8888);
? ? ? ? //监听
? ? ? ? Socket accept = ss.accept();
? ? ? ? //创建一个输入流对象接收数据
? ? ? ? InputStream inputStream = accept.getInputStream();
? ? ? ? byte[] bytes=new byte[1024];
? ? ? ? int len=inputStream.read(bytes);
? ? ? ? String data =new String(bytes,0,len);
? ? ? ? System.out.println(data);
? ? ? ? accept.close();
? ? ? ? ss.close();
?
文件上传
从本地读取文件数据,发送给服务器端
服务器端接受数据后,保存到服务器本地
?
//客户端
? ?//获取客户端Socket对象
? ? ? ? Socket s = new Socket("127.0.0.1", 8888);
? ? ? ? //从本地读取要上次的文件
? ? ? ? BufferedInputStream bis = new BufferedInputStream(new FileInputStream("JavaSE\\aa.jpg"));
? ? ? ? OutputStream os = s.getOutputStream();
? ? ? ? byte[] bys = new byte[1024];
? ? ? ? int i;
? ? ? ? while ((i = bis.read(bys)) != -1) {
? ? ? ? ? ? // os.write(i);
? ? ? ? ? ? os.write(bys, 0, i);
? ? ? ? }? ? ? ? os.flush();
? ? ? ? //给服务器一个结束标记,标识已经传输完毕
? ? ? ? s.shutdownOutput();? ? ? ? //获取服务器给回的信息
? ? ? ? BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
? ? ? ? String line;
? ? ? ? while ((line = br.readLine()) != null) {
? ? ? ? ? ? System.out.println(line);
? ? ? ? }? ? ? ? //释放资源
? ? ? ? bis.close();
? ? ? ? s.close();//======================================
//服务器端
?//创建服务器ServerScoket对象
? ? ? ? ServerSocket ss = new ServerSocket(8888);
? ? ? ? //开始监听
? ? ? ? Socket s = ss.accept();
? ? ? ? //接受客户端数据
? ? ? ? InputStream is = s.getInputStream();
? ? ? ? //创建一个字符缓冲流保存接受的数据
? ? ? ? BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("JavaSE\\bb.jpg"));
? ? ? ? int len;
? ? ? ? byte[] bys = new byte[1024];
? ? ? ? while ((len = is.read(bys)) != -1) {
? ? ? ? ? ? bos.write(bys, 0, len);
? ? ? ? }
? ? ? ? //告诉客户端已经接受完毕
? ? ? ? s.shutdownInput();? ? ? ? //给客户端返回“上传成功信息”
? ? ? ? BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
? ? ? ? bw.write("上传成功");
? ? ? ? bw.newLine();
? ? ? ? bw.flush();? ? ? ? //释放资源
? ? ? ? bos.close();
? ? ? ? s.close();
? ? ? ? ss.close();
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!