zoukankan      html  css  js  c++  java
  • 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 + "
    " + msg + "
    ";
    		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 + "
    " + new String(bb) + "
    ";
    		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();
    
  • 相关阅读:
    题目1202:排序------注意每个数字的后面都有空格
    题目1178:复数集合------------结构体的的比较,cmp()函数的错误让我WA了多次
    题目1041:Simple Sorting-------注意最后一个数字的处理
    题目1034:寻找大富翁---用了sort()函数,注意头文件;
    题目1415:不一样的循环队列------注意细节小地方循环队列注意%M;还有为什么M要加一!!!!!!!!!!!!!
    题目1342:寻找最长合法括号序列II---注意:不要求就近匹配,只要求( 在 )前面的任一个位置即可
    题目1398:移动次数-----最少移动的次数,那么相同的最大值越靠后越好,相同的最小值越靠前越好
    题目1375:陈博的完美主义(25分)----------------题目中对输入数字的长度有要求,所以输入字符串,用atoi()转换函数
    题目1363:欢乐斗地主------用数组计数的应用,注意1和2得排在最后,表示最大
    题目1174:查找第K小数-------qsort()可以直接对数组用;还有用unique(a,a+n);的,服!
  • 原文地址:https://www.cnblogs.com/nianzhilian/p/9108749.html
Copyright © 2011-2022 走看看