java网络编程
什么是网络编程
简单的来说就是端到端根据网络传输协议相互之间建立连接并传输数据。
网络编程大致可分为UDP和TCP
二者对比如下:
UDP
流程实现原理图:
案例:
发送方:
//1、创建手机 DatagramSocket sendSocket = new DatagramSocket(); //2、准备数据 //表示向哪个ip地址发送数据 InetAddress other = InetAddress.getByName("192.168.0.101"); int port = 8888; String msg = "约吗"; //3、包装数据 DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.getBytes().length, other, port); //4、发 sendSocket.send(dp); //5、关闭 sendSocket.close();
接收方:(运行的时候先运行接收方)
//1、创建手机 DatagramSocket ds = new DatagramSocket(8888); //2、创建空位置 byte[] bb = new byte[10]; //3、打包拆包 DatagramPacket dp = new DatagramPacket(bb,bb.length); //4、接包 ds.receive(dp);//线程阻塞直到接收到数据才开始往下执行 //读取数据 System.out.println(dp.getAddress().getHostAddress()+new String(bb)); //5、关闭 ds.close();
简易的聊天程序:(重复的是我给我自己发显示的数据)
核心代码:
public void sendMsg() throws Exception { // 验证数据 if (textField.getText() == null || textField.getText().length() == 0) { JOptionPane.showMessageDialog(frame, "ip地址不能为空"); return; } if (textField_1.getText() == null || textField_1.getText().length() == 0) { JOptionPane.showMessageDialog(frame, "消息不能为空"); return; } // 1、创建端对象 DatagramSocket ds = new DatagramSocket(); // 2、准备数据 // 获取要发送主机的InetAddress对象 InetAddress ind = InetAddress.getByName(textField.getText()); int port = 8888; String msg = textField_1.getText(); // 3、打包 DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.getBytes().length, ind, port); // 4、发送包 ds.send(dp); // 5、关闭 ds.close(); // 拼接数据 Date date = new Date(); SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String rq = simple.format(date); String ipAddress = InetAddress.getLocalHost().getHostAddress(); String all = ipAddress + " " + rq + "\n" + msg + "\n"; textArea.append(all); } public void resiveMsg() throws Exception { // 1、为主机上的某个程序建立端口链接 DatagramSocket ds = new DatagramSocket(8888); // 2、准备空包裹 (存放拆包放的空间) byte[] bb = new byte[100]; // 3、拆包 DatagramPacket dp = new DatagramPacket(bb, bb.length); // 4、接收 ds.receive(dp); // 5、关闭 ds.close(); // 拼接数据 Date date = new Date(); SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String rq = simple.format(date); String ipAddress = dp.getAddress().getHostAddress(); String all = ipAddress + " " + rq + "\n" + new String(bb) + "\n"; textArea.append(all); }
TCP
TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的
连接,对发送数据的大小无限制。但是占用资源大,效率低。
tcp连接需要以下步骤:
1、服务器端建立ServerSocket对象 通过accept方法等待客户端连接
2/3、客户端通过socket对象和服务器端建立连接
4、服务器端会通过accept方法与客户端建立私密连接
5、二端之间开始通信
原理图:
简单实例:
客户端:
while(true){ //1、和服务器创建连接 Socket so = new Socket("192.168.1.164", 9999); //2、从连接中取出输出流 并发消息 OutputStream os = so.getOutputStream(); Scanner sc = new Scanner(System.in); System.out.println("请输入要发送的消息");//有线程阻塞不会发生死循环 String msg = sc.nextLine(); os.write(msg.getBytes()); //3、从连接中取出输入流并接收回话 接收消息 InputStream is = so.getInputStream(); byte[] bb = new byte[20]; is.read(bb); System.out.println(new String(bb)); //4、关闭连接 so.close(); }
服务器端:
//1、创建服务器连接对象 ServerSocket ss = new ServerSocket(9999); while(true){ //2、获取连接对象(建立连接) 建立阻塞直到客户端有请求时才往下走代码 Socket sok = ss.accept(); //3、从连接中取出输入流来接收消息 接收消息 InputStream is = sok.getInputStream();//有阻塞 //来辆车 byte[] bb = new byte[20]; is.read(bb); //4、从连接中取出输出流并回话 发送消息 OutputStream os = sok.getOutputStream(); os.write("服务器:就是没钱".getBytes()); System.out.println(new String(bb)); //5、关闭连接 sok.close(); }
通过TCP简易上传文件:
核心代码:
客户端:
public void upload() throws UnknownHostException, IOException{ String path = textField.getText(); File ff = new File(path); if(path == null || path.length() == 0){ JOptionPane.showMessageDialog(frame, "请输入路径"); return; } if(!ff.exists()){ JOptionPane.showMessageDialog(frame, "路径不存在"); return; } if(!ff.isFile()){ JOptionPane.showMessageDialog(frame, "文件不存在"); return; } //边读边发消息 Socket sok = new Socket("192.168.0.101", 9999); FileInputStream fs = new FileInputStream(ff); OutputStream os = sok.getOutputStream(); byte[] bb = new byte[1024*1024]; while(true){ int len = fs.read(bb); if(len == -1){ break; } os.write(bb, 0, len); } fs.close(); sok.shutdownOutput(); //只关闭管道,不影响手机或连接 //从连接中获取输入流接收回话 (接收消息) InputStream is = sok.getInputStream(); byte[] aa = new byte[10]; is.read(aa); JOptionPane.showMessageDialog(frame, new String(aa)); sok.close(); }
服务器端:
ServerSocket ss = new ServerSocket(9999); //1、建立连接 Socket so = ss.accept();//阻塞 直到服务器端接收到消息 //2、从连接中获取输入流 接收消息 InputStream is = so.getInputStream(); FileOutputStream fs = new FileOutputStream("c:\\test\\x.mp4"); byte[] bb = new byte[1024*1024]; while(true){ int len = is.read(bb); if(len == -1){ break; } fs.write(bb, 0, len); } fs.close(); //3、从连接中获取输出流 回话(向客户端发送消息) OutputStream os = so.getOutputStream(); os.write("上传成功".getBytes()); //4、关闭连接 so.close();