网络编程
-
网络通信协议
- 网络:由多台计算机,以及外部设备连接起来的一个系统成为网络
- 通信协议:规定网络上传输的数据的格式、大小、速度
- TCP/IP协议、UDP协议
-
IP地址和端口号
- IP地址
- 端口号
- MySql—3306
- Web服务器—Tomcat----8080
- Oracle----1521
-
InetAddress类(代表IP地址的类)
- 方法
public static InetAddress getByName(); //获取远程主机的IP
public static InetAddress getLocalHost(); //获取计算机的IP地址对象
public static String getHostName(); //获取用户名
public static String getHostAddress(); //获取IP地址
//示例
InetAddress my = InetAddress.getLocalHost(); //返回值为一个IP地址类对象
String myName = my.getHostName(); //获取用户名
String myAddress = my.getHostAddress(); //获取IP
System.out.println(my);
System.out.println(myName);
System.out.println(myAddress);
-
使用UDP进行数据交换
-
DatagramSocket:数据接收发送器
-
DatagramPacket:数据包对象
-
发送端操作步骤:
-
创建一个数据接收发送器
-
创建一个数据包对象
-
发生(send方法)
-
示例
-
-
//1.创建发送器
DatagramSocket ds = new DatagramSocket();
//2.创建数据包
while(true) {
System.out.println("请输入需要发送的数据:");
Scanner sc = new Scanner(System.in);
String data = sc.nextLine();
byte [] arr = data.getBytes();
//将数据整理,放入包中
DatagramPacket dp = new DatagramPacket(arr,arr.length,InetAddress.getByName("127.0.0.1"),12345);
//3.发送
ds.send(dp);
}
-
接收方操作步骤
-
创建一个数据接收发送器
-
创建一个数据包对象
-
接收(receive)
-
示例
-
//1.创建发送器
DatagramSocket ds = new DatagramSocket(12345); //设置接收器的端口号
byte[] getData = new byte[1024]; //创建一个字符数组接收数据
//2.创建接收数据包
while(true) {
System.out.println("正在等待接收数据~~~");
DatagramPacket dp = new DatagramPacket(getData,getData.length);
//3.接收数据
ds.receive(dp);
//4.获取发送者的IP地址
String sendAddress = dp.getAddress().getHostAddress();
System.out.println(sendAddress+"正在向本机发送数据~~~");
System.out.println("发送的数据:"+ new String(getData));
}
-
使用TCP数据交换
用户端:
-
创建一个客户端对象(注意:指定这个Socket要连接的服务器的IO和端口号)
- 此构造方法自动连接服务器
- 自动进行三次握手,并建立连接
- 自动为连接创建两个流
-
从客户端对象中获取输出流:getOutputStream();
-
调用输出流的Write方法写数据到服务器
-
调用输入流的read方法获取服务器的反馈
-
关闭资源
-
示例
-
Socket client = new Socket("127.0.0.1",12345); //设置发送器的目的ip和端口号
client.getOutputStream().write("你好呀,我是xxx,很高兴认你!!!".getBytes()); //获取输出流,并发送数据
String serverReturn = new ReadDemo().TCPRead(client); //获取服务器反馈
System.out.println("数据发送成功!!!");
System.out.println("收到服务器反馈数据:"+serverReturn);
client.close();
服务器端
-
创建ServersSocket对象,传入一个端口
-
先获取哪一个客户端的服务器,通过accept()方法获取
-
通过Sockrt对象获取输入流,调用read方法读取客户端发来的数据
-
通过Socket对象获取输出流,调用write方法想客户端反馈数据
-
关闭(ServerSocket,Socket)
-
示例
ServerSocket server = new ServerSocket(12345); //设置接收数据端口
System.out.println("等待客户端访问......");
Socket client = server.accept(); //获取发送数据的客户端对象
String data = new ReadDemo().TCPRead(client); //读取数据
System.out.println("IP为"+client.getInetAddress().getHostAddress()+"的客户端发送了:"+data);
client.getOutputStream().write("服务器已收到数据。".getBytes());
client.close();
server.close();
多线程使用TCP上传文件到服务器示例
客户端
//1.创建Socket对象,连接服务器
Socket client = new Socket("192.168.1.102",12345);
//2.获取输出流,把数据写到数据库
OutputStream out = client.getOutputStream();
//3.创建文件输入流,读取本地文件
FileInputStream fr = new FileInputStream("1.txt");
byte[] by = new byte[1024];
int len = 0;
while((len=fr.read(by))!=-1) {
//4.向服务器上传数据
out.write(by, 0, len);
}
//5.向服务器说明数据上传完毕
client.shutdownOutput();
System.out.println("数据发送成功!!!");
//6.获取服务器反馈
String serverReturn = new ReadDemo().TCPRead(client);
System.out.println("收到服务器反馈数据:"+serverReturn);
client.close();
服务器端
//1.创建服务器对象
ServerSocket server = new ServerSocket(12345);
while(true) {
System.out.println("等待客户端访问......");
//2.获取连接服务器的客户端
Socket client = server.accept();
//开启一个线程,和client进行交互
new Thread(new Runnable() { //匿名内部接口
@Override
public void run() {
try {
//3.获取输入流,读取客户端发来的数据
InputStream in = client.getInputStream();
//4.创建文件的输出流,把数据保存到文件
FileOutputStream out = new FileOutputStream("demo.txt");
//5.循环从输入流读取客户数据输出到文件中
byte[] by = new byte[1024];
int len = 0;
while((len = in.read(by))!=-1) {
out.write(by, 0, len);
}
System.out.println("IP为"+client.getInetAddress().getHostAddress()+"上传数据成功。");
//6.服务器反馈
client.getOutputStream().write("服务器已收到数据。".getBytes());
client.close(); //关闭客户端对象
out.close(); //关闭文件输出流
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}