day26_网络编程第一天
1、网络通信三要素(掌握)
端口号
协议(UPD&TCP)
1.不需要建立连接;2、UDP协议与TCP协议各自特点(掌握)
UDP
2.有数据大小限制,每个数据报的大小在限制在64k;
3.无连接,是不可靠协议;
4.速度快。
TCP
1.在连接中进行大数据量传输(数据无限制);
2.通过三次握手完成连接;
3.是可靠协议;
4.必须建立连接,效率会稍低。
3、Socket
网络通信其实就是Socket之间的通信,比如Socket对象1和Socket对象2 两个对象之间的通信
Socket通信中数据底层是通过IO流来传输的
4、InetAddress
IP信息的包装类
本机ip 127.0.0.1
ping 192.168.1.xxx
常用方法:
获取本地主机:getLocalHost获取任意主机:getByName(String ip)
主机名:getHostName
主机Ip地址:getHostAddress
5、DatagramPacket
概述:
数据包对象,两个Socket之间是通过发送和解析DatagramPacket来交互的
构造方法:
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket ,用来接收长度为 length 的数据包。 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 |
成员方法:
InetAddress | getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 |
byte[] | getData() 返回数据缓冲区。 |
int | getLength() 返回将要发送或接收到的数据的长度。 |
int | getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 |
SocketAddress | getSocketAddress() 获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。 |
void | setAddress(InetAddress iaddr) 设置要将此数据报发往的那台机器的 IP 地址。 |
void | setData(byte[] buf) 为此包设置数据缓冲区。 |
void | setData(byte[] buf, int offset, int length) 为此包设置数据缓冲区。 |
void | setLength(int length) 为此包设置长度。 |
void | setPort(int iport) 设置要将此数据报发往的远程主机上的端口号。 |
6、UDP代码
package udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 创建码头
* 创建集装箱
* 发送
* @author haoyongliang
*
*/
public class Client {
public static void main(String[] args) throws Exception{
System.out.println("客户端启动了啊");
byte[] data = "nihao a".getBytes();
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(data, data.length,InetAddress.getByName("192.168.48.10"),12306);
socket.send(packet);
socket.close();
}
}
服务端代码
package udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 1、创建码头
* 2、创建集装箱
* 3、将码头拿到的数据装入集装箱
* 4、通过集装箱获取数据
* @author haoyongliang
*
*/
public class Server {
public static void main(String[] args)throws Exception {
DatagramSocket socket = new DatagramSocket(12306);
DatagramPacket packet = new DatagramPacket(new byte[1024*64], 1024*64);
socket.receive(packet);
byte[] data = packet.getData();
int length = packet.getLength();
System.out.println(new String(data,0,length));
}
}
4、TCP代码
客户端 给服务器发送数据第一次
服务器给客户端响应数据第二次
客户端再次给服务端发送数据第三次
客户端代码
package tcp;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception{
//1、创建soket
Socket socket= new Socket("127.0.0.1", 12306);
/*
* A 客户端向服务端写数据
*/
OutputStream os = socket.getOutputStream();
os.write("nihao,server,I'm client".getBytes());
os.flush();
/*
* D 客户端读取服务端发送过来的数据
*/
InputStream inputStream = socket.getInputStream();
byte[] data = new byte[1024];
int len = inputStream.read(data);
System.out.println(new String(data,0,len));
socket.close();
}
}
服务端代码
package tcp;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception{
//1、创建ServerSocket
ServerSocket ss = new ServerSocket(12306);
//2、与客户端建立连接
Socket socket = ss.accept();//从请求队列中拿到Socket对象
/*
* B 服务端读取客户端发过来的数据
*/
InputStream inputStream = socket.getInputStream();
byte[] data = new byte[1024];
int len = inputStream.read(data);
System.out.println(new String(data,0,len));
/*
* C 服务端向客户端写入数据
*/
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hehe".getBytes());
outputStream.flush();
socket.close();
}
}
5、练习
2、大写转换服务器
3、判断用户登陆
4、上传文件
6、今天必须掌握的内容,面试题,笔试题。(掌握这个就可以放心学习后面的知识了)
1、说说网络编程三要素
2、说说UDP和TCP的区别
3、说说TCP的三次握手协议过程
4、用TCP完成文件上传代码