javaSE学习笔记————网络编程

javaSE传智博客视频学习day28笔记————反射

内容

  1. ip地址与端口号
  2. 在Java中获取ip地址
  3. UDP编程
  4. TCP编程
  5. TCP多线程编程

ip地址与端口号

ip地址就每台机器的地址

端口号:例如你的机器中装了一个QQ与YY,我向你的ip发送了一个信息,如果没有端口号就不知道这个信息是

发往在QQ上还是YY上,假如QQ的端口号是8888,那我就知道了,发送的时候就附上端口号,信息就显示在QQ上了。

端口号的取值是0-65535,但是0-1023被系统占用了。

在Java中获取ip地址

	InetAddress i = InetAddress.getByName("www.baidu.com");
		//主机名
		System.out.println(i.getHostName());//www.baidu.com
		
		System.out.println(i.getHostAddress());//180.97.33.108

getByName的参数也可以是IP地址

获取本地IP:

InetAddress local = InetAddress.getLocalHost();

local.getHostName = 主机名

local.getHostAddress=IP

UDP编程

UDP是User Datagram Protocol的简称,称为用户数据报协议。

可以理解为广播,你只管发送信息,不管有没有人在接受。但是有丢数据的危险。

DatagramPacket类是打成包裹,上面写上地址

DatagramSocket类是负责传送上面的Packet

发送端:

发送的整个过程可以看作一场寄快递的过程。

 

		//创建要发送的数据
		byte [] data = "HelloWorld".getBytes();
		//创建要发送的主机
        InetAddress ip =InetAddress.getByName("127.0.0.1");		
		//封装成一个packet,打包
		DatagramPacket dp = new DatagramPacket(data, data.length, ip, 6000);
		//创建一个发送端
		DatagramSocket ds = new DatagramSocket();
		//发送
		ds.send(dp);
		//关闭资源
		ds.close();

接收脚本:

		//创建接收端,指定端口号
		DatagramSocket ds = new DatagramSocket(6000);
		//创建接收包裹
		byte [] b = new byte[1024];
		DatagramPacket dp = new DatagramPacket(b, b.length);
		//接受
		ds.receive(dp);
		//获取字符长度
		int len =dp.getLength();
		//获取ip
		String ip = dp.getAddress().getHostAddress();
		//获取端口号
		int port = dp.getPort();
		//打印
		System.out.println(ip+"("+port+")"+":  "+new String(b,0,len));
		//关闭
		ds.close();

先运行接收脚本,再是发送脚本。

TCP编程

TCP是Transmission Control Protocol的简称,称为传输控制协议。没有丢数据的危险。

每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,第三次握手,客户端再次向服务器端发送确认信息,确认连接。

TCP分为一个服务器端,与客户端。

中间连接的是Socket,客户往Socket存数据,服务器就往Socket取数据。

服务器端:

		//开启服务器端口
		ServerSocket server = new ServerSocket(8888);
		//等待接收Socket
		Socket s = server.accept();
		//拿到Socket的输入流
		InputStream in = s.getInputStream();
		//输出拿到的数据
		byte [] b =new  byte[1024];
		int len = in.read(b);
		System.out.println(new String(b,0,len));
		//向客户端输出数据
		OutputStream out = s.getOutputStream();
		out.write("收到了".getBytes());
		
		server.close();

客户端:

		//创建Socket对象、连接服务器
		Socket socket =new Socket("127.0.0.1",8888);
		//通过客户端的套接字对象Socket
		OutputStream out = socket.getOutputStream();
		out.write("你好服务器".getBytes());
		
		InputStream in = socket.getInputStream();
		byte [] b = new byte[1024];
		int len = in.read(b);
		System.out.println(new String(b,0,len));
		
		socket.close();

TCP多线程编程

客户端不变代码(一个上传图片的脚本):

注意上传完图片必须:socket.shutdownOutput(停止输出)

		Socket socket = new Socket("192.168.1.105",8888);
	
		OutputStream out = socket.getOutputStream();
		
		//获取图片
		FileInputStream fileIn = new FileInputStream("E:\\lf.jpg");
		//上传图片
		int len = 0;
		byte [] by = new byte[1024];
		while((len=fileIn.read(by))!=-1){
			out.write(by, 0, len);
		}
		socket.shutdownOutput();
		//
		InputStream in = socket.getInputStream();
		len = in.read(by);
		System.out.println(new String(by,0,len));
		fileIn.close();
		socket.close();

线程:

public class Upload implements Runnable {
	private Socket socket;
	public Upload(Socket s ){
		this.socket = s;
	}
	@Override
	public void run() {
		try {
			//拿到输入流
			InputStream in = socket.getInputStream();
			//随机文件名
			String fileName =System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";
			//确定文件的放置的位置
			File upload = new File("c:\\upload");
			//如果没有就创建
			if(!upload.exists())
				upload.mkdir();
			//本地文件输出流
			FileOutputStream file = new FileOutputStream(upload+File.separator+fileName);
			//开始把拿到的文件  in.read(b)  = 那文件数据 到 数组 b中 ,输出到本地文件夹中
			int len = 0;//存放每次的字节长度
			byte [] b = new byte[1024];
			while((len = in.read(b))!=-1){
				file.write(b,0,len);
			}
			//反向输出客户端通知上传图片成功
			OutputStream out = socket.getOutputStream();
			out.write("上传成功".getBytes());
			file.close();
			socket.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

服务端:

public class ThreadTCP {

	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8888);
		
		while(true){
			//等待socket
			Socket socket = server.accept();
			//等到了就开启一个线程
			new Thread(new Upload(socket)).start();//一旦开始了,就开始下次的等待
			
		}
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值