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互相发送消息
- 接收方的快递点
- 接受
- 从仓库中读取数据
- 关闭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();
}
}