Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天

时间:2023-03-08 18:13:47
Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天



网络编程

网络模型

*OSI参考模型

*Tcp/IP参考模型

网络通读要素

*IP地址

*端口号

*传输协议



1.找到对方Ip

2.数据要发送到对方指定的的应用程序上,为了标识这些应用程序,所经给这些网络应用程序都用数字进行标识。

为了方便称呼这个数字,叫做端口,逻辑端口。0-65535任选。0-1024端口被系统所用。mysql:3306

web:80 tomcat:8080 ftp:21 远程:3389 端口只能有一个,不能相互冲突

3.定义通信规则,这个通讯规则。

检测网卡是否出问题,可以通过ping 127.0.0.1进行,看是否能Ping通。



网线就是标准的物理层设备

OSI参考模型

应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。





数据封包,然后就是数据拆包

Tcp/IP参考模型(从上往下)

应用层,传输层(tcp/ip),网际层(ip),主机至网络层



javaweb网络开发,我们是在应用层做



IP地址:网络中设备的标识

不易记忆,可用主机名。

本地回环地址:127.0.0.1 主机名:localhost

端口号:

用于标识进程的逻辑地址,不同进程的标识。

有效端口:0-65535,其中0-1024,系统使用或保留端口。

传输协议:通讯的规则。

常见的协议:TCP,UDP



TCP和UDP的特点:

TCP:建立连接,形成传输数据的通道 

在连接中进行大数据传输。

通过三次握手完成连接,是可靠协议。

必须建立连接,效率会稍低。

如果连接中断,它会记住上次连接到那里

UDP:

将数据用源目的封装成数据包中,不需要建立连接。

在发据前,不需要建立连接。就是给邮局寄东西。

如果没找到,包就会丢掉。发的包是有限制的。

每个数据报的大小限制在64K内。

因载连接,是不可靠协议。

不需要建立连接。速度快。

如果对方真在的话,就马上收到了。

相当于固话机,在某一频段上。开着就能收到。

服务端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 需求:定义一个应用程序,用于接收udp协议
 * 传输的数据服务并处理。
 * 思路:1.定义一udpsocket服务,通常会指定一个监听端口,
 * 其实就是给这个接收网络应用程序定久数字标识,方便
 * 于明确哪些应用程序发消息过来。
 * 2.定义一个数据包,因为要存储接收到的字节
 * 数据,因为数据包对象中有更多功能可以提取
 * 字节数据中的不同的数据信息。
 * 3.通过socket服务的receive方法将收到的数据
 * 存入已定义好的数据包中。
 * 4.通过数据包对象的特有功能,将这些不同的数
 * 据取出,打印在控制台上。
 * 5.关闭资源。
 * @author hjl
 *
 */

public class UDPReceive {
	//接收端的内容都来自10000端口。
	public static void main(String [] args)throws Exception{
		//1.创建udp socket,建立端点。
		DatagramSocket ds=new DatagramSocket(10000);

		while(true){
		//2.定义数据包,用于存储,分析这个缓冲区,
		byte[] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		//3.通过服务的receive方法将收到数据存入数据包中。
		ds.receive(dp);//这是一个阻塞式方法

		//4.通过数据包中的方法获取其中的对象。
		String ip =dp.getAddress().getHostAddress();
		String data=new String(dp.getData(),0,dp.getLength());

		int port=dp.getPort();
		System.out.println(ip+"::"+data+"::"+port);
		//这个port是系统随机给发送端应用程序的一个标识
		//数据是从port出来的。发送至接收端的10000端口
		}
		//关闭资源
		//ds.close();
	}
}

客户端:

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

/**
 * 需求:通过udp传输方式,将一段文字数据发送出去
 * 思路:1.建立udpSocket服务。
 * 2.提供数据,并将数据封装到数据包中。
 * 3.通过Socket服务的发送功能,将数据包发出去。
 * 4.关闭数据。
 * @author hjl
 *
 */
public class UDPSend {

	public static void main(String [] args)throws Exception {
		//1.创建udp服务,通过DatagramSocket对象。
		DatagramSocket ds=new DatagramSocket(8888);//我们也可以在这里指定端口
		//2.确定数据,并封装成数据包,DatagramSocket(byte[] buf,int length,InetAddress address,int port)
		byte[] buf="zhe shi udp shuju".getBytes();
		DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("172.16.196.12"),10000);
		//3.通过Socket服务,将已有的数据包发送出去。通过send方法
		ds.send(dp);
		ds.close();

	}

}

网络编程之键盘录入UDP

服务端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceive2 {

	public static void main(String [] args) throws Exception{
		DatagramSocket ds=new DatagramSocket(10001);

		while(true){
			byte[] buf=new byte[1024];

			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			ds.receive(dp);//阻塞式方法

			String ip=dp.getAddress().getHostAddress();
			String data=new String (dp.getData(),0,dp.getLength());

			System.out.println(ip+"::"+data);
		}

	}

}



客户端:

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

public class UDPSend2 {

	public static void main(String [] args)throws Exception{
		DatagramSocket ds=new DatagramSocket();
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		String line=null;
		while((line=bufr.readLine())!=null){//readline也是阻塞式方法
			if("886".equals(line))
				break;
			byte[] buf=line.getBytes();
			DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("172.16.196.12"),10001);
			ds.close();

		}
	}

}

Socket编程:

Socket就是网络服务提供的一种机制。

通信的两端都有Socket。

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。



每个应用程序都类似有一个sockect,然后进行互联。

 先有港口,然后才有船只进行装货,卸货。

为网络服务提供一种机制。



UDP传输

DatagramSocket与DatagramPacket

建立发送端,接收端,

建立数据包。

调用Socket的发送接收方法。

关闭Socket。

发送端与接收端是两个独立的运行程序。



DatagramPacket:

数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。



端口绑定异常,一般都是服务端口被应用多次。常出现在一些循环中。



TCP传输:

Socket和ServerSocket

建立客户端和服务端

建立连接后,通过socket中的IO流进行数据的传输。

关闭socket,同样,客户端与服务端是两个独立的应用程序。



客户端发送数据给服务端,这里指的是发送文本,然后服务端把文本存起来。

这个例子的重点是标识怎么定义的问题。如果要利用上传图片的话,就不能用字符流,而要用字节流。



客户端:

import java.io.*;
import java.net.*;
class TextClient {
	public static void main(String [] args) throws IOException{
		Socket s= new Socket("192.168.1.254",10006);
		BufferedReader bufr=new
		BufferedReader(new FileReader("client.java");//这个文件一定要判断,是否存在。
		PrintWriter out=new PrintWriter(s.getOutPutStream(),true);

		//判断标识
		DataOutputStream dos=new DataOutputStream(s.getoutputStream());
		longtime=System.currentTimeMills();
		dos.writeLong(time);

		String line=null;
		While((line=bufr.readLine())!=null){
			out.println(line);

		}
		s.shutdownOutput();//关闭客户端的输出流。相当于给注中加入一个结束标识。
		dos.writeLong(time);
		//out.println("over");
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
		String str=bufIn.readLine();
		System.out.println(str);
		bufr.close();
		s.close();

	}
}

服务端:

class TextServer{
	public static void main(String [] args){
		ServerSocket ss=new ServerSocket(10006);
		Socket s=ss.accept();
		String ip=s.getInetAddress().getHostAddress();
		System.out.println(ip+"....is connected");
		//判断标识
		DataInputStream dis=new DataInputStream(s.getInputStream());
		long l=dis.readLong();//把时间戳读完

		BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
		PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);

		String line=null;
		while((line=bufIn.readLine())!=null){
			//if("over".equals(line))
			//break;
			out.println(line);

		}

		PrintWriter pw=new PrintWriter(s.getOutputStream().true);
		pw.println("上传成功");
		out.close();
		s.close();
		ss.close();

	}

}