TCP,UDP发送信息,网络编程,枚举

1.TCP复制文件

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
	public static void main(String[] args) throws IOException {
		File file = new File("aaa.txt");
		FileInputStream fis = new FileInputStream(file);
		byte[] bs = new byte[1024];
		int num = 0;		
		//socket发送消息
		Socket socket = new Socket("localhost",6666);
		OutputStream os = socket.getOutputStream();				
		while ((num=fis.read(bs))!=-1) {
			os.write(bs,0,num);
			os.flush();
		}		
		//关闭资源
		fis.close();
		os.close();
		socket.close();
	}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
	public static void main(String[] args) throws IOException {
		System.out.println("服务端启动了");
		ServerSocket serverSocket = new ServerSocket(6666);
		Socket socket = serverSocket.accept();		
		InputStream is = socket.getInputStream();
		byte[] bs = new byte[1024];
		int num = is.read(bs);		
		FileOutputStream fos = new FileOutputStream("bbb.txt");
		fos.write(bs,0,num);
		fos.flush();		
		fos.close();
		is.close();
		socket.close();
		serverSocket.close();		
	}
}

在这里插入图片描述
2.多个客户端服务端互相通信
当接受到一个人的消息以后,需要目前来说连接的所有客户端进行转发

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Scanner;
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("请输入用户名");
		Scanner sc = new Scanner(System.in);
		String username = sc.next();
		//创建客户端
		Socket socket = new Socket("127.0.0.1",8888);
		OutputStream os = socket.getOutputStream();
		PrintWriter writer = new PrintWriter(os);		
		InputStream is = socket.getInputStream();
		while (true) {
			String msg = sc.next();
			writer.println(msg);
			writer.flush();
		}
	}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MyThread implements Runnable{
	Socket socket;	
	public MyThread(Socket socket) {
		super();
		this.socket = socket;
	}
	@Override
	public void run() {
		//接收信息
		InputStream is = null;
		try {
			is = socket.getInputStream();
			byte[] bs = new byte[1024];
			int num = is.read(bs);
			String str = new String(bs,0,num);
			System.out.println(socket.getInetAddress()+"客户端发送过来的是"+str);		
			for (int i = 0; i < Server.list.size(); i++) {
				System.out.println(Server.list);
				System.out.println(str);
				Socket socket2 = Server.list.get(0);
				OutputStream os = socket2.getOutputStream();
				os.write(str.getBytes());
				os.flush();
			}
		} catch (IOException e) {			
			e.printStackTrace();
		}finally {
			if(is!=null) {
				try {
					is.close();
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
		}		
	}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
	static ArrayList<Socket> list = new ArrayList<>();
	public static void main(String[] args) throws IOException {		
		ServerSocket serverSocket = new ServerSocket(8888);
		while (true) {
			Socket socket = serverSocket.accept();
			list.add(socket);
			MyThread thread = new MyThread(socket);
			Thread t = new Thread(thread);
			t.start();
		}
	}
}

3.UDP互相发送消息

  1. 接收方的快递点
  2. 接受
  3. 从仓库中读取数据
  4. 关闭socket

1.发送方法
2.快递点
3.要发送的数据
4.将数据打包
5.发送

  • 关闭注意:
    发送方的端口号是默认提供的,与接收方法的端口号一定不同
    回复数据的时候一定要用p.getPort()
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Send{
	public static void main(String[] args) throws IOException {
		//快递点
		DatagramSocket socket = new DatagramSocket();
		//要发送的数据
		String str = "开心";
		//将数据打包
		DatagramPacket packet = new DatagramPacket(str.getBytes(),0,str.getBytes().length, InetAddress.getByName("127.0.0.1"),7777);
		//发送
		socket.send(packet);
		//接收
		byte[] bs = new byte[1024];
		DatagramPacket p = new DatagramPacket(bs, bs.length);
		socket.receive(p);		
		String str2 = new String(p.getData(),p.getOffset(),p.getLength());
		System.out.println("接收方回复数据"+str2);
		//关闭
		socket.close();
	}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Recieve {
	public static void main(String[] args) throws IOException {
		System.out.println("接收方启动了");
		//接收方需要设定端口号
		DatagramSocket socket = new DatagramSocket(7777);
		//2.接收 提前准备好一个空仓库
		byte[] bs = new byte[1024];
		DatagramPacket packet = new DatagramPacket(bs, bs.length);//能装数据		
		//接收数据 如果一直没等到发送方的数据,receive方法阻塞,类似于TCP中的accept
		socket.receive(packet);		
		String str = new String(packet.getData(),packet.getOffset(),packet.getLength());		
		System.out.println("发送方发送的数据"+str);		
		System.out.println(packet.getAddress());
		System.out.println(packet.getPort());
		//回复
		DatagramPacket p = new DatagramPacket("不开心".getBytes(), 0,"不开心".getBytes().length,packet.getAddress(),packet.getPort());
		socket.send(p);
		//关闭socket
		socket.close();
	}
}

4.网络编程
网络
网络的分类:
广域网 城域网 局域网
网络层: IP协议
传输层: TCP/UDP协议
应用层: http
TCP 长连接 http短连接

TCP: 面向连接 ,可靠的传输层协议, 传输数据的大小无限制,不安全
UDP: 面向无连接的, 不可靠的传输层协议, 传输数据的大小是不能超过64kb, 安全

IP: 给网络中每一台设备,设定的唯一标识
	255.255.255.255    4个字节   32 位
	
基于TCP网络编程:
	客户端(发送,接受回复)      服务端(接受和回复)
	    Socket                ServerSocekt
	 基于字节流实现的  写socket.getOutputStream
	 			  读:socket.getInputStream
	 	                       
	 	 accept() 接受客户端,有阻塞功能
	 	                       			
	  1.创建Socket对象		1.创建ServerSocket对象
	  2. 准备数据				2. accept() 接受客户端
	  3. 获取输出流			3. 获取输入流对象
	  4. 将数据通过输出发送出去      4. 读取数据
	  5. 关闭流和socket		5. 关闭流和socket
	 
基于UDP网络编程
	 发送方							接受方
	DatagramSocket         			DatagramSocket  
    DatagramPacket        			 DatagramPacket	  
      
    1. DatagramSocket不需要添加参数      1. DatagramSocket(端口号)
    2. DatagramPacket 5个参数		  2. receive() 接受,需要准备一个空包裹
    3. socket.send(packet)		  3. 通过packet.getData(). getOffset()  getLength
    4. 关闭socket				  4. 闭关socket

5.UDP接收方与发送方互相发送信息

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Send {
	public static void main(String[] args) throws IOException {
		// 1.快递点
		DatagramSocket socket = new DatagramSocket();
		// 2.准备数据
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("请输入要发送的消息");
			String str = sc.next();
			// 3.准备要发送的包裹
			DatagramPacket packet = new DatagramPacket(str.getBytes(), 0, str.getBytes().length,InetAddress.getByName("127.0.0.1"),9999);;			
			// 4.发送
			socket.send(packet);
			//结束标志
			if("拜拜".equals(str)) {
				break;
			}
			//以下接收接收方回复的数据
			byte[] bs = new byte[1024];
			DatagramPacket p = new DatagramPacket(bs, bs.length);
		socket.receive(p);
		//将数据转成String字符串
		String str2 = new String(p.getData(),p.getOffset(),p.getLength());
		System.out.println("接收方回复"+str2);
		if("拜拜".equals(str2)) {
			break;
		}		
		}
		//关闭socket
		socket.close();
	}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Scanner;
public class Recieve {
	public static void main(String[] args) throws IOException {		
		//1.快递点
		DatagramSocket socket = new DatagramSocket(9999);
		Scanner sc = new Scanner(System.in);		
		while (true) {
			byte[] bs = new byte[1024];
			DatagramPacket packet = new DatagramPacket(bs, bs.length);
			socket.receive(packet);
			//转成字符串
			String str = new String(packet.getData(),packet.getOffset(),packet.getLength());
			System.out.println("接收到发送方发送的数据"+str);
			if("拜拜".equals(str)) {
				break;
			}
			//发送数据
			System.out.println("请输入要回复的数据");
			String str2 = sc.next();
			DatagramPacket packet2 = new DatagramPacket(str2.getBytes(),str2.getBytes().length,packet.getAddress(),packet.getPort());
			socket.send(packet2);
			if("拜拜".equals(str2)) {
				break;
			}
		}
		socket.close();
	}
}

5.枚举
enum 枚举
1 自己本类对象,作为属性(本类对象是由自己创建出来的),自己的对象只能在自己枚举类型中创建
switch可用参数:byte short int char jdk.1.7以后String 枚举
枚举作为属性

public enum Gender {,;
}
public class Person {
	String name;
	int age;
	double height;
	double weight;
	// 枚举作为属性
	Gender gender;
	public Person(String name, int age, double height, double weight, Gender gender) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
		this.weight = weight;
		this.gender = gender;
	}
	public Person() {
		super();
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", height=" + height + ", weight=" + weight + ", gender="
				+ gender + "]";
	}
}
public class Test4 {
	public static void main(String[] args) {
		Person person = new Person("张三", 4, 5, 2, Gender.);
		System.out.println(person);
	}
}

枚举类型 不支持 继承 但是支持多实现接口

例:手机营业厅店庆促销,推出特价手机,
三星U1228-特价398元,苹果6P128G-特价3989,华为P20-特价1888
编写查询方法实现,根据手机品牌,显示特价价格

public enum Phone{
	三星U1228(398),苹果6P128G(3989),华为P20(1888);
	private int price;
	private Phone(int price) {
		this.price = price;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	@Override
	public String toString() {		
		return name()+"特价"+price;
	}
}
public class Test2 {
	public static void main(String[] args) {
		Phone[] values = Phone.values();
		for (Phone phone : values) {
			System.out.println(phone);
		}		
		Phone 三星U1228 = Phone.三星U1228;
		三星U1228.setPrice(398);
		System.out.println(三星U1228);		
		三星U1228.smile();
		三星U1228.happy();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值