`
u010570991
  • 浏览: 7359 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

"黑马程序员 "网络编程UDP+TCP+HTTP

 
阅读更多
 

android培训java培训期待与您交流!!!

 

本篇是学习网络编程的笔记,介绍了网络的模型,网络通讯的要素,网络通信的传输协议。

下图介绍简要介绍了网络编程的轮廓



 下图对介绍了TCP,UDP,HTTP传输协议,以及如何使用这些协议进行简单的网络传输操作



 以下是使用多线程+UDP实现一个简单的聊天程序的示例代码段1


发送消息端,将发送消息的任务封装到线程的run()

package com.Chat;

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * 创建UDP传输的发送端。
 * 思路:
 * 1,建立udp的socket服务。
 * 2,将要发送的数据封装到数据包中。 
 * 3,通过udp的socket服务将数据包发送出去。
 * 4,关闭socket服务。
 */
public class Send implements Runnable{
	//1,udpsocket服务。使用DatagramSocket对象。
	
private DatagramSocket  ds;
public Send(DatagramSocket ds){
	this.ds=ds;
}
	@Override
	public void run() {
		System.out.println("发送端启动!!");
		
			while (true){
				BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
				String line=null;
				try {
					while((line=buf.readLine())!=null){
						//2,将要发送的数据封装到数据包中。
						byte []  bt=line.getBytes();
						DatagramPacket dp=new DatagramPacket(bt, bt.length, InetAddress.getByName("192.168.1.104") ,8888);
						ds.send(dp);
						if(line.equals("over"))break;
						
					}
				} catch (Exception e) {
				
					e.printStackTrace();
				}
				if(ds!=null)ds.close();	
			}	
		
	}

}

 接收发送的消息。

 

package com.Chat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * 建立UDP接收端的思路。
 * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
 * 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
 * 3,使用socket服务的receive方法将接收的数据存储到数据包中。
 * 4,通过数据包的方法解析数据包中的数据。
 * 5,关闭资源 
 */
public class Rece implements Runnable {
	
private DatagramSocket ds;
public Rece(DatagramSocket ds){
	this.ds=ds;
}
	@Override
	public void run() {
		System.out.println("接收端启动");
		while(true){
			byte [] buf=new byte[1024];
			//2.创建数据包
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			try {
				// 3,使用接收方法将数据存储到数据包中
				ds.receive(dp);
				// 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
				String ip=dp.getAddress().getHostAddress();
				int port =dp.getPort();
				byte [] bt=dp.getData();//数据内容
				String data=new String(bt,0,dp.getLength());
				System.out.println(ip+"---"+port+":"+data);
				if(data.equals("over")){
					System.out.println(ip+"退出了");
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}

 启动程序,实现聊天

package com.Chat;

import java.net.DatagramSocket;
import java.net.SocketException;

public class chatTest {
	
	public static void main(String[] args) {
		try {
			DatagramSocket send=new DatagramSocket(10000);
			DatagramSocket rece=new DatagramSocket(8888);
			Thread t1=new Thread(new Send(send));
			Thread t2=new Thread(new Rece(rece));
			t1.start();
			t2.start();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

 聊天程序到这里就完成了。

 

以下程序是使用多线程技术+TCP是先一个服务端同时处理多个客户端上传图片的请求。

下面是服务端的实现代码,运行时服务端应该先启动

 

package com.TcpTest;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPciServer {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket ss=new ServerSocket();
		
		while(true){
			Socket s=ss.accept();
			new Thread(new uploadTasd(s)).start();
		}

	}

}

 因为客户端执行多个上传任务是需要多线程来实现,所以将上传文件的操作封装成线程任务

 

package com.TcpTest;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class uploadTasd implements Runnable {
	private Socket s;
	private static final int SIZE = 1024*1024*2;
	public uploadTasd(Socket s) {
		super();
		this.s = s;
	}

	@Override
	public void run() {
		
		try {
			//获取Socket
			
			String ip=s.getInetAddress().getHostAddress();
			System.out.println(ip+"-----------connected");
			int count=0;
			
				File dir=new File("c:/upload");
				if(!dir.exists()){
					System.out.println(dir.mkdirs());
					
				}
				
				File file = new File(dir, ip + ".jpg");
				//如果文件已经存在于服务端 ,避免文件的覆盖
				while(file.exists()){
					file = new File(dir,ip+"("+(++count)+").jpg");
				}
				FileOutputStream fos = new FileOutputStream(file);
				BufferedOutputStream bos=new BufferedOutputStream(fos);
				BufferedInputStream bis=new BufferedInputStream(s.getInputStream());
				int len=0;
				while((len=bis.read())!=-1){
					bos.write(len);
					if(file.length()>SIZE){
						System.out.println(ip+"文件体积过大");
						
						bos.close();
						s.close();
						
						
						System.out.println(ip+"...."+file.delete());
						
						return ;
					}
				}
				OutputStream out=s.getOutputStream();
				out.write("上传成功!".getBytes());
				bos.close();
			s.close();
		
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		
	}

}

 下面是客户端的实现代码

 

package com.TcpTest;


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient {

	/**
	 * @throws Exception 
	 * @throws UnknownHostException 
	 * 
	 */
	public static void main(String[] args) throws UnknownHostException, Exception {
		
		//创建Socket客户端对象
			Socket s=new Socket("192.168.1.104",10000);
			FileInputStream fis=new FileInputStream(new File("c:/89.jpg"));
			OutputStream out=s.getOutputStream();
			
			byte [] buf=new byte[1024];
			int len=0;
			while((len=fis.read(buf))!=-1){
				out.write(buf,0,len);
				
			}
			s.shutdownOutput();//告诉服务端说:这边的数据发送完毕。让服务端停止读取
			//读取服务端发回的内容
			byte [] btIn=new byte[1024];
			InputStream is=s.getInputStream();
			int lenIn=	is.read(btIn);
			String answer=new String(btIn, 0,lenIn);
			System.out.println(answer);
			fis.close();
			s.close();
	}

}

 

  • 大小: 162.8 KB
  • 大小: 510.7 KB
分享到:
评论

相关推荐

    黑马程序员基础测试题答案

    4、 什么情况下适合用UDP协议,什么情况下适合用TCP协议? 5、 throw和throws有什么区别? try、catch、finally分别在什么情况下使用? 6、 声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用...

    黑马程序员-Qt讲义.pdf

    Socket通信是网络编程中不可或缺的技术,Qt支持基于TCP/IP协议的客户端和服务器端编程,以及UDP通信和组播技术。 多线程是现代应用程序中用来提高性能的重要技术。Qt提供了多线程编程的支持,包括线程的基本概念...

    黑马程序员入学面试题

    - **传输协议**:如TCP/IP协议,用于规定数据如何在网络中传输。 - **端口号**:用于标识网络中不同服务或应用的端口,客户端通过端口号与服务器通信。 - **IP地址**:用于唯一标识网络中的设备。 #### 12. UDP和...

    2018-2019年黑马最新版Java程序员面试宝典+题库pdf

    8. **网络编程**:Socket编程基础,TCP和UDP的区别,以及HTTP协议的理解。 9. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、建造者模式、装饰器模式、观察者模式等,并能灵活运用到实际项目中。 10. ...

    Python中文版黑马课程+源码+demo+api

    11. **网络编程**:介绍如何使用Python进行HTTP请求,或者实现简单的TCP/UDP通信。 12. **数据分析与可视化**:利用Pandas进行数据清洗和分析,用Matplotlib或Seaborn绘制图表。 13. **自动化脚本**:教授如何编写...

    01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip

    8. **网络编程**:包括TCP和UDP协议,Socket编程,以及服务器和客户端的交互。 9. **反射和注解**:讲解如何通过反射动态操作类、接口和对象,以及注解的使用和自定义注解的实现。 10. **垃圾回收机制**:理解Java...

    黑马程序员《Java自学宝典》源代码

    10. **网络编程**:学习Socket编程,包括TCP和UDP通信,理解服务器端和客户端的实现。 11. **Java API**:熟悉Java提供的各种标准库,如Math类、Date类、Calendar类等,以及各种实用工具类。 12. **JDBC**:了解...

    java黑马笔记.rar.rar

    网络编程部分可能包括套接字编程,如Socket和ServerSocket的使用,以及TCP和UDP协议的实现。 最后,理解JVM(Java虚拟机)的工作原理对优化代码性能至关重要。笔记可能涉及类加载机制、内存模型、垃圾收集算法以及...

    黑马入学基础测试

    黑马程序员训练营基础测试题目 为什么需要配置path 什么时候需要classpath 什么情况下适合用UDP协议 什么情况下适合用TCP协议 编程计算3乘8等于几 什么方法效率更高 throw和throws有什么区别 try catch finally...

    Java程序设计任务驱动式教程

    9. **网络编程**:基础的Socket编程,了解TCP和UDP协议,以及如何创建服务器和客户端程序。 10. **泛型**:理解泛型的作用,学会在类、接口、方法和集合中使用泛型。 11. **JavaFX或Swing**:对于图形用户界面...

    2017最新黑马laravel5.4在线教育平台笔记10天,加socket,swoole,手机直播笔记

    Swoole提供异步非阻塞的TCP/UDP服务器,HTTP服务器,WebSocket服务器等,特别适合处理大量并发请求,对于在线教育平台中的实时互动场景,如视频直播、聊天室等,Swoole能显著提高性能,降低延迟。 【标签】:...

    vertx框架视频

    4. **TCP、UDP和套接字**:除了HTTP,Vert.x还允许直接操作TCP、UDP和套接字,为低级网络编程提供了可能,适合构建物联网(IoT)应用或者自定义通信协议。 5. **文件系统操作**:内置的文件系统操作API让你能够便捷地...

    笔记_笔记_

    【描述】:“这份JAVA笔记详尽记录了黑马程序员线下课程的基础语言部分,涵盖了JAVA编程的核心概念和技术。” 【知识点详解】 1. **JAVA语言基础** - 变量与数据类型:JAVA支持基本数据类型(如int, double, char...

    面试宝典Python 391页.pdf

    4. **网络编程与并发**:对Python的socket编程进行了讲解,包括TCP和UDP通信,以及线程和进程的使用,为处理并发问题提供了理论基础。 5. **数据库操作**:介绍了如何使用Python与常见的关系型数据库(如MySQL、...

    传智播客java就业班全部PPT

    Java编程语言作为软件开发领域的主流技术之一,深受程序员的喜爱,尤其对于初学者和求职者来说,掌握Java技能是进入IT行业的关键。传智播客是一家知名的教育机构,其推出的“java就业班”课程旨在帮助学员在短时间内...

Global site tag (gtag.js) - Google Analytics