- 网络编程
- InetAddress类
- 常用方法
- 协议
- UDP的三种通讯方式
- 三次握手
- 四次挥手
- 再网络通讯写一下,不同计算机上运行的程序,可以进行数据传输。
网络编程三要素
- 网络IP地址----------设备再网络中的地址,时唯一标识
- 端口号-----------------应用再设备中唯一的标识
- 传输协议---------------数据再网络中传输的规则,常用的协议有UDP和TCP
IPv4
32bit == 4组 ===8bit为一组
采用点分十进制表示法进行表示
IPv6
128bit地址长度,分为8组,两字节分为一组
冒分十六进制表示,前面有零可以省略
public class InetAddressDemo1 { public static void main(String[] args) throws Exception { //static InetAddress getByName(String host)确定主机名称的IP地址 InetAddress byName = InetAddress.getByName("DESKTOP-B94P8SK"); //String getHostName() 获取次IP地址的主机名 String hostName = byName.getHostName(); System.out.println(hostName); //String getHostAddress() 返回文本显示中的IP地址字符串 String Ip = byName.getHostAddress(); System.out.println(Ip); } }协议
计算机中连接和通讯的规则被称之为网络通讯协议
UDP
- 面向无连接
- 速度块,大小限制64K,数据不安全,容易丢失
发送端步骤
- 创建发送端的DatagramSocket对象
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
public class ClientDemo { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); String s = "你好呀!"; byte[] bytes = s.getBytes(StandardCharsets.UTF_8); InetAddress address = InetAddress.getByName("127.0.0.1"); int port = 10000; DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port); ds.send(dp); ds.close(); } }
发送端步骤:
- 创建接受端的对象DatagramSocket对象
- 创建接受数据对象
- 调用DatagramSocket的方法接受数据并将数据放入箱子中
- 解析数据包,并把数据再控制台显示
- 释放资源
public class ReceiveDemo { public static void main(String[] args)throws Exception{ DatagramSocket ds = new DatagramSocket(10000); byte[] b = new byte[1024]; DatagramPacket dp = new DatagramPacket(b,b.length); ds.receive(dp); byte[] data = dp.getData(); int length = dp.getLength(); System.out.println(new String(data,0,length)); ds.close(); } }UDP的三种通讯方式
- 单播,上面演示的就是单单播,一对一传输
- 组播(IPv4)
public class ClientDemo { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); String s = "你好呀吗!"; byte[] bytes = s.getBytes(); //组播地址 InetAddress address = InetAddress.getByName("224.0.1.0"); int port = 10000; DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port); ds.send(dp); ds.close(); } }
public class ReceiveDemo { public static void main(String[] args)throws Exception{ //创建加入组播的对象 MulticastSocket ms = new MulticastSocket(10000); byte[] bytes = new byte[1023]; DatagramPacket dp = new DatagramPacket(bytes,bytes.length); //把当前计算机绑定一个组播地址,表示添加到这一组中 ms.joinGroup(InetAddress.getByName("224.0.1.0")); ms.receive(dp); int length = dp.getLength(); System.out.println(new String(bytes,0,length)); ms.close(); } }
- 广播—广播地址为:255.255.255.255
书写方式根单播一摸一样,把地址改一下就行
TCP
发送端步骤:
- 创建客户端的Socket对象与指定服务器端连接
- 获取输出流写数据
- 释放资源
public class ClientDemo1 { public static void main(String[] args)throws Exception{ //1. 创建一个Socket对象 Socket socket = new Socket("127.0.0.1",10000); //2. 获取一个IO流开始写数据 OutputStream os = socket.getOutputStream(); os.write("你好".getBytes()); //3. 释放资源 os.close(); socket.close(); } }
接收数据的步骤
- 创建服务器的Socket对象
- 监听客户端连接,返回一个Socket对象
- 获取输入流对象,读数据,并把数据显示再控制台
public class ServerDemo1 { public static void main(String[] args) throws Exception{ //1 创建Socket对象 ServerSocket ss = new ServerSocket(10011); //2. 等待客户端连接 Socket accept = ss.accept(); //3. 获取输入流对象 InputStream is = accept.getInputStream(); int len; while ((len = is.read())!=-1){ System.out.print((char)len); } //4. 释放资源 is.close(); ss.close(); } }三次握手
- 客户端向服务端发出连接请求,等待确认
- 服务器向客户端返回一个响应 ,告诉客户端接收到了请求
- 客户端向服务器再次发出确认消息,连接建立
- 向客户端发出取消连接的请求
- 服务器向客户端返回一个响应,表示收到客户端取消请求
- 服务器将最后的数据处理完毕,服务器再向客户端发出确认取消消息
- 客户端再次发送确认消息,连接取消
练习
- 客户端: 发送数据,接受服务器反馈
- 服务器: 接受数据,给出反馈
public class ClientDemo1 { public static void main(String[] args)throws Exception{ Socket socket = new Socket("127.0.0.1",11000); OutputStream os = socket.getOutputStream(); os.write("hello".getBytes()); //仅仅关闭输出流,并写一个结束标记,对socket没有任何影响 socket.shutdownOutput(); // InputStream is = socket.getInputStream(); // int b; // while ((b = is.read()) != -1) { // System.out.println((char) b); // } BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); os.close(); socket.close(); } }
public class ServerDemo1 { public static void main(String[] args)throws Exception{ ServerSocket ss = new ServerSocket(11000); Socket accept = ss.accept(); InputStream is = accept.getInputStream(); int b; while ((b = is.read()) != -1) { System.out.println((char) b); } // OutputStream os = accept.getOutputStream(); // os.write("你是谁".getBytes()); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream())); bw.write("拿来吧你!!!"); bw.close(); is.close(); ss.close(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)