传输层是整个TCP/IP协议的控制部分,负责应用进程之间的端到端的通信。传输层要系统的管理数据信息的流动,还要提供可靠地传输协议,确保数据准确、有序到达目的地。 |
计算机端口(port) 是计算机与外界通信交流的出口。计算机通过端口区分Internet的各种服务. |
// ip字节表示形式 byte[] address = localHost.getAddress(); System.out.println(Arrays.toString(address)); // Java 的字节数是有符号的,能存-128~ 127. System.out.println(Integer.toBinaryString(192)); System.out.println(Integer.toBinaryString(-64)); } |
// 获取www.baidu.com InetAddress[] allBynameBaidu = InetAddress.getAllByName(host); for (InetAddress i : allBynameBaidu) { System.out.println(i.getHostAddress()); } } |
// 创建数据包 String data = "你好我是UDP"; InetAddress ip = InetAddress.getByName("192.168.10.252"); DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length, ip, 50000); // 发送数据 socket.send(packet); // 关闭socket socket.close(); System.out.println("udp发送端数据发送完毕"); } } |
// 发送数据 socket.send(packet); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭socket socket.close(); } System.out.println("udp发送端数据发送完毕"); } } |
DatagramSocket socket = null; try { socket = new DatagramSocket(50000); // 创建接受的数据包 byte[] byt = new byte[1024]; DatagramPacket packet = new DatagramPacket(byt, byt.length); // 接收 socket.receive(packet); // 获取发送方ip InetAddress address = packet.getAddress(); String hostAddress = address.getHostAddress(); // 获取发送方端口号 int port = packet.getPort(); // 获取数据 byte[] data = packet.getData(); // 获取数据长度 int dataLen = packet.getLength(); System.out.println("IP:" + hostAddress + "端口号:" + port + "发送了: " + new String(data, 0, dataLen)); } catch (IOException e) { e.printStackTrace(); } finally { socket.close(); } System.out.println("接收端接受完毕..."); } } |
while (true) { System.out.println("请输入发送信息:"); String message = br.readLine(); if (!"bye".equals(message)) { break; } // 准备数据包,封装数据 DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("127.0.0.1"), 50000); // 发送数据 socket.send(packet); } } catch (IOException e) { e.printStackTrace(); } finally { // 关闭关闭socke socket.close(); } System.out.println("发送端数据数据发送完毕"); |
// 创建Socket,指定端口 DatagramSocket socket = null; try { socket = new DatagramSocket(50000); // 创建数组 byte[] byt = new byte[1024]; // 创建packet DatagramPacket packet = new DatagramPacket(byt, byt.length); while (true) { // 接收数据 socket.receive(packet); // 获取发送发ip String ip = packet.getAddress().getHostAddress(); // 获取发送方端口 int port = packet.getPort(); // 获取数据长度 int dataLen = packet.getLength(); // 获取数据 byte[] data = packet.getData(); // 转为字符串 String mess = new String(data, 0, dataLen); System.out .println("发送方:" + ip + " 端口:" + port + " 发送了:" + mess); if ("bye".equals(mess)) { break; } } } catch (IOException e) { e.printStackTrace(); } finally { socket.close(); } } |
// 与服务端建立连接,获取输入输出流 InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); |
while (true) { // 将数据写出到服务端 System.out.println("客户端发送数据..."); System.out.println("你说:"); String mess = br.readLine(); System.out.println("你告诉了服务端:"); out.write(mess.getBytes()); // 获取服务端的回话 int len = in.read(byt); System.out.print("服务端告诉我了:"); System.out.println(new String(byt, 0, len)); if ("bye".equals(mess)) { break; } } // 关闭socket out.close(); } } |
// 获取输入流输出流 InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); // 获取客户端ip,端口 InetAddress inetAddress = socket.getInetAddress(); String ip = inetAddress.getHostAddress(); int port = socket.getPort(); byte[] byt = new byte[1024]; BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); while (true) { // 获取客户端数据 System.out.println("服务端接收数据:"); int len = in.read(byt); String mess = new String(byt, 0, len); System.out.println("客户端:" + ip + ":" + port + "告诉了服务端:" + mess); // 向客户端回话. System.out.println("你要告诉客户端:"); String str = br.readLine(); out.write(str.getBytes()); if ("bye".equals(mess)) { break; } } // 关闭客户端 socket.close(); // 关闭服务端 server.close(); } } |
InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请录入:"); String mess = br.readLine(); out.write(mess.getBytes()); System.out.println("-----------获取服务器的回馈--------------"); byte[] byt = new byte[1024]; int len = in.read(byt); System.out.println(new String(byt, 0, len)); socket.close(); } } |
len = ips.read(byt); mess = new String(byt, 0, len); if ("文件存在".equals(mess)) { System.out.println("文件存在,无需上传"); return; } // 上传 FileInputStream fis = new FileInputStream(file); while ((len = fis.read(byt)) != -1) { ops.write(byt, 0, len); } System.out.println("文件上传完毕"); len = ips.read(byt); System.out.println("服务器说:" + new String(byt, 0, len)); ops.close(); socket.close(); } private static File getFile() { // 用户输入文件路径 Scanner sc = new Scanner(System.in); while (true) { System.out.println("请输入文件的路径名:"); String nextLine = sc.nextLine(); // 创建File File file = new File(nextLine); if (!file.exists()) { System.out.println("文件不存在"); continue; } if (file.isDirectory()) { System.out.println("不支持目录"); continue; } return file; } } |
// 5 len = ips.read(byt); String fileName = new String(byt, 0, len); System.out.println("文件名:" + fileName); // 根据文件名创建File对象, File file = new File("d:\\", fileName); // 8获取文件长度 len = ips.read(byt); long length = Long.parseLong(new String(byt, 0, len)); // 9判断文件是否存在 if (file.exists() && file.length() == length) { System.out.println("文件已经存在"); ops.write("文件存在".getBytes()); return; } else { ops.write("文件不存在".getBytes()); } // 12接收 FileOutputStream fos = new FileOutputStream(file); while ((len = ips.read(byt)) != -1) { fos.write(byt, 0, len); fos.flush(); //服务器中的写出文件时,如果客户端socket没有关闭,那么读不到文件末尾,需要强制结束(判断文件长度是否一致) if (file.length() == length) { System.out.println("文件上传完毕..."); ops.write("文件接收完毕".getBytes()); break; } } fos.close(); client.close(); server.close(); } } |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |