案例一:
我们在实际生活中收发数据的时候是持续不断的,所以我们需要在发送端用键盘录入数据实现循环发数据(如果输入"quit"停止),接收端循环把接收到的数据打印到控制台上。
- 发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端对象
DatagramSocket ds = new DatagramSocket();
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//不断循环输入数据
while(true){
//获取录入的信息
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
//如果输入quit,则退出输入
if("quit".equals(line)){
break;
}else{
//否则将数据打包,传送出去
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getLocalHost(), 12306);
ds.send(dp);
}
}
//释放资源
ds.close();
}
}
- 接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(12306);
//循环接收数据
while(true){
//创建包对象
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//解析数据
//获取发送端ip对象
InetAddress address = dp.getAddress();
//获取数据
byte[] data = dp.getData();
//获取数据长度
int length = dp.getLength();
//输出数据
System.out.println("发送端ip地址为:"+address);
System.out.println(new String(data,0,length));
}
}
}
案例二:
使用TCP协议发送数据,并将接收到的数据转换成大写返回
步骤:
客户端发出数据
服务器端接收数据
服务器端转换数据
服务器端发出数据
客户端接收数据
- 客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) throws IOException, IOException {
// 1.创建客户端Socket对象
Socket s = new Socket(InetAddress.getLocalHost(), 12306);
// 2.获取输入流对象,用来接收键盘录入的信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个字符串:");
String str = br.readLine();
// 3.创建输出流对象,发送数据
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(str);
// 12.获取输入流对象
BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 13.接收数据
String line = br2.readLine();
// 14.输出数据
System.out.println(line);
// 15.释放资源
s.close();
br.close();
}
}
- 服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 4.创建服务器端Socket对象
ServerSocket ss = new ServerSocket(12306);
// 5.监听
Socket s = ss.accept();
// 6.创建输入流对象
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 7.读取数据
String str = br.readLine();
// 8.转换数据
String newStr = str.toUpperCase();
// 9.获取输出流对象
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
// 10.返回数据
pw.println(newStr);
// 11.释放资源
s.close();
}
}
拓展:
(1)System系统类
static InputStream in :标准输入流,是一个数据源指向的是 键盘录入的 字节输入流
static PrintStream out :标准输出流,是一个数据目的指向的是 控制台的 字节输出流
(2)PrintWriter 字符打印流
可以直接输出一个字符串,并且自动加换行,还可以自动刷新。仅用于输出!
构造方法:
PrintWriter pw = new PrintWriter(OutputStream is,boolean autoFlush);
普通方法:println() 写数据的方法 相当于OutputStream的writer方法
案例三:
模拟用户登录案例改写
模拟数据库,把用户的登录信息放在数据库里面,用输入的用户信息创建一个用户对象,用这个用户对象和数据库中的用户对象进行比较,得出结果。
补充:
静态代码块:随着类的加载而加载,只加载一次,加载类时需要做的一些初始化,比如加载驱动。格式:
static {
初始化数据
}
- 用户类
public class User {
private String name;
private String passWord;
public User() {
}
public User(String name, String passWord) {
super();
this.name = name;
this.passWord = passWord;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
//contains方法的底层比较调用的是equals方法,初始的equals方法比较的是两个对象的地址值,所以需要重写equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (passWord == null) {
if (other.passWord != null)
return false;
} else if (!passWord.equals(other.passWord))
return false;
return true;
}
}
- 用户数据库类(模拟数据库)
import java.util.ArrayList;
import java.util.List;
public class UserDB {
private static List users = new ArrayList();
static {
users.add(new User("zhangsan", "123"));
users.add(new User("lisi", "456"));
users.add(new User("wangwu", "789"));
users.add(new User("itheima", "itheima"));
}
public static List getUsers() {
return users;
}
}
- 客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket(InetAddress.getLocalHost(), 12306);
// 创建键盘输入流对象,接收数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String name = br.readLine();
System.out.println("请输入密码:");
String passWord = br.readLine();
// 创建输出流对象,输出数据
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(name);
pw.println(passWord);
// 创建输入流对象,接收数据
BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br2.readLine();
System.out.println(str);
// 释放资源
s.close();
br.close();
}
}
- 服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
public class ServerTest {
public static void main(String[] args) throws IOException {
// 创建服务器端Socket对象
ServerSocket ss = new ServerSocket(12306);
// 监听
Socket s = ss.accept();
// 创建输入流对象,接收用户名和密码
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String name = br.readLine();
String passWord = br.readLine();
User user = new User(name, passWord);
// 创建输出流
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
// 判断用户名和密码是否相同
if (UserDB.getUsers().contains(user)) {
pw.println("登陆成功");
} else {
pw.println("登录失败");
}
// 释放资源
s.close();
}
}