java 网络编程 url-udp-tcp

java 网络编程

通俗的来说, 网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输。Java语言也支持网络编程,JDK提供的 java.net包提供了很多于网络编程相关的类,来支持网络编程方面的学习。这一节一般分为三小节,都不难知道思路就算是熟记了;

URL

URL是英语Uniform Resource Locator的简称,中文统一资源定位符的意思。是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上标准资源的地址。
接下来是怎么用了:有三种简单常用方法,我感觉需要记住的也就是一个URL的openstream()方法获取到io流之后就是一个简单的io流操作了;

/*
	 * 第一次操作是会有乱码的;是直接用了URL
	 * 第二次是把URL扔到inputstreamreder的构造器里边了,他是可以指定编码集的;然后就是用bufferedreader可以增加效率;
	 */
	public static void main(String[] args) throws IOException {

		/*try(InputStream is = new URL("http://www.baidu.com").openStream();){
			int temp = -1;
			while((temp=is.read())!=-1) {
				System.out.print((char)temp);
			}}catch(Exception e ) {
				System.out.println("操作异常");
			}*/
//		test();
		text2();
	}
	public static void test() throws MalformedURLException, IOException {
		try(BufferedReader reader = new BufferedReader(new InputStreamReader(new URL("http://www.baidu.com").openStream(),"utf8"))){
			String msg;
			while((msg=reader.readLine())!=null) {
				System.out.println(msg);
			}}catch(Exception e) {
				System.out.println("操作异常");
			}
	}
	public static void text2() throws IOException {
		//读取到一个文件加里边;
		try(BufferedReader reader = new BufferedReader(new InputStreamReader(new URL("http://www.baidu.com").openStream(),"utf8"));
				BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("baidu.html"),"utf8"));){
				//这个地方是也是可以指定字符集的;不要是用工程的字符集;
			String msg;
			while((msg=reader.readLine())!=null) {
				writer.write(msg);
				writer.newLine();//为什么这个地方是没有换行的;
			}
		}
	}

udp

udp是个协议,跟tcp一样他俩都是协议;
 udp协议:

a)将数据封装到包中,不需要建立连接,面向无连接的数据传输,从而也是不可靠的。

b)每个数据包的大小不超过64k

c)由于不需要建立连接,所以,传输是高效的
 发短信就是一种udp,我们可能经历过那种,过年了群发祝福可能对方收不到(丢包),过完年才收到(服务器阻塞延迟),等等在2G时代都是很广泛存在的;
 使用udp编程大致思路如下(使用了多线程让两者实现能够通信(不适用多线程那只能够你一句我一句这种样子,有了多线程可以将收发都分开,实现群聊也是这个思路,必须是分开的!)):

//一个接受端,封装起来了便于多人用;
public class TalkRecevie implements Runnable{
	private DatagramSocket server;
	
	public TalkRecevie(int port) {
		try {
			server = new DatagramSocket(port);
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		while(true) {
			//使用DatagramSocket 指定端口 创建接收端
			byte[] container = new byte[1024*60];
			DatagramPacket packet = new DatagramPacket(container,0,container.length);
			//阻塞式接受包裹receive(DatagramPacket p),注意这个阻塞式!
			try {
				server.receive(packet);
				byte[] datas = packet.getData();
				int len = packet.getLength();
				String str = new String(datas,0,len);
				System.out.println(str);
				if(str.equals("bye")) {
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			}
		server.close();
		}
	}
 
public class TalkSend implements Runnable{
	private DatagramSocket client;
	private BufferedReader reader;
	private String toIP;
	private int toPort;
	
	
	public TalkSend(int port,String toIP, int toPort) {
		this.toIP = toIP;
		this.toPort = toPort;
		try {
			client = new DatagramSocket(port);
			reader = new BufferedReader(new InputStreamReader(System.in));
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		System.out.println("发送方启动中....");
		//使用DatagramSocket 指定端口  创建发送端
		while(true) {
		try {
		//准备数据一定转成字节数组;
		String data = reader.readLine();
		byte[] datas = data.getBytes();
		//封装成DatagramPacket 包裹,需要指定目的地
		DatagramPacket packet = new DatagramPacket(datas,0,datas.length,
				new InetSocketAddress(this.toIP,this.toPort));
		//发送包裹send(DatagramPacket p)*
		client.send(packet);
		//释放资源
		if(data.equals("bye")) {
			break;
		}
		}catch(Exception e) {
			e.printStackTrace();
		}
		}
		client.close();
	}
//建立一个基于两个类的聊天实现
public class TextStudents {
	public static void main(String[] args) {
		new Thread(new TalkSend(8880,"localhost",9999)).start();//自己使用的端口,toip,toport;
		new Thread(new TalkRecevie(7777)).start();
	}
}
//第二个
public class TextTeacher {
	public static void main(String[] args) {
		new Thread(new TalkSend(8888,"localhost",7777)).start();
		new Thread(new TalkRecevie(9999)).start();
	}
}

tcp

tcp协议:

a)建立连接,从而形成可靠的传输通道

b)可以传输大量的数据

c)数据传输可靠的,通过三次握手来保证可靠性

d)必须建立连接,效率会稍慢。
 先来看一个简单的server-client实例:

//tcp服务端
public class TcpServer {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8888);
		Socket client = server.accept();
		System.out.println("一个客户端建立了链接");
		InputStream is = client.getInputStream();
		byte[] b = new byte[1024];
		int len = -1;
		while((len=is.read(b))!=-1) {
			System.out.println("可以");
		}
		/*DataInputStream dis = new DataInputStream(client.getInputStream());
		String data = dis.readUTF();
		System.out.println(data);*/
		/*client.close();
		server.close();*/
	}
}
//tcp发送端
public class TcpSend {
	public static void main(String[] args) throws IOException {
		System.out.println("---------Client----------");
		Socket client = new Socket("localhost",8888);
//		DataOutputStream dos = new DataOutputStream(client.getOutputStream());
		String data = "hello";
		OutputStream os = client.getOutputStream();
		String msg = "测试";
		os.write(msg.getBytes());
		/*dos.writeUTF(data);
		dos.flush();*/
		client.close();
	}
}

同理这里边也没有用多线程,他们也是只能够你一言我一句的发送,不能实现真正意义上的通讯的;当然办法很多,想要了解更多那就直接通过一个群聊小项目来加深理解吧,下边附有链接;

发布了4 篇原创文章 · 获赞 14 · 访问量 130

猜你喜欢

转载自blog.csdn.net/weixin_45127611/article/details/103948030