javaSE传智博客视频学习day28笔记————反射
内容
- ip地址与端口号
- 在Java中获取ip地址
- UDP编程
- TCP编程
- TCP多线程编程
ip地址与端口号
ip地址就每台机器的地址
端口号:例如你的机器中装了一个QQ与YY,我向你的ip发送了一个信息,如果没有端口号就不知道这个信息是
发往在QQ上还是YY上,假如QQ的端口号是8888,那我就知道了,发送的时候就附上端口号,信息就显示在QQ上了。
端口号的取值是0-65535,但是0-1023被系统占用了。
在Java中获取ip地址
InetAddress i = InetAddress.getByName("www.baidu.com");
//主机名
System.out.println(i.getHostName());//www.baidu.com
System.out.println(i.getHostAddress());//180.97.33.108
getByName的参数也可以是IP地址
获取本地IP:
InetAddress local = InetAddress.getLocalHost();
local.getHostName = 主机名
local.getHostAddress=IP
UDP编程
UDP是User Datagram Protocol的简称,称为用户数据报协议。
可以理解为广播,你只管发送信息,不管有没有人在接受。但是有丢数据的危险。
DatagramPacket类是打成包裹,上面写上地址
DatagramSocket类是负责传送上面的Packet
发送端:
发送的整个过程可以看作一场寄快递的过程。
//创建要发送的数据
byte [] data = "HelloWorld".getBytes();
//创建要发送的主机
InetAddress ip =InetAddress.getByName("127.0.0.1");
//封装成一个packet,打包
DatagramPacket dp = new DatagramPacket(data, data.length, ip, 6000);
//创建一个发送端
DatagramSocket ds = new DatagramSocket();
//发送
ds.send(dp);
//关闭资源
ds.close();
接收脚本:
//创建接收端,指定端口号
DatagramSocket ds = new DatagramSocket(6000);
//创建接收包裹
byte [] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
//接受
ds.receive(dp);
//获取字符长度
int len =dp.getLength();
//获取ip
String ip = dp.getAddress().getHostAddress();
//获取端口号
int port = dp.getPort();
//打印
System.out.println(ip+"("+port+")"+": "+new String(b,0,len));
//关闭
ds.close();
先运行接收脚本,再是发送脚本。
TCP编程
TCP是Transmission Control Protocol的简称,称为传输控制协议。没有丢数据的危险。
每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,第三次握手,客户端再次向服务器端发送确认信息,确认连接。
TCP分为一个服务器端,与客户端。
中间连接的是Socket,客户往Socket存数据,服务器就往Socket取数据。
服务器端:
//开启服务器端口
ServerSocket server = new ServerSocket(8888);
//等待接收Socket
Socket s = server.accept();
//拿到Socket的输入流
InputStream in = s.getInputStream();
//输出拿到的数据
byte [] b =new byte[1024];
int len = in.read(b);
System.out.println(new String(b,0,len));
//向客户端输出数据
OutputStream out = s.getOutputStream();
out.write("收到了".getBytes());
server.close();
客户端:
//创建Socket对象、连接服务器
Socket socket =new Socket("127.0.0.1",8888);
//通过客户端的套接字对象Socket
OutputStream out = socket.getOutputStream();
out.write("你好服务器".getBytes());
InputStream in = socket.getInputStream();
byte [] b = new byte[1024];
int len = in.read(b);
System.out.println(new String(b,0,len));
socket.close();
TCP多线程编程
客户端不变代码(一个上传图片的脚本):
注意上传完图片必须:socket.shutdownOutput(停止输出)
Socket socket = new Socket("192.168.1.105",8888);
OutputStream out = socket.getOutputStream();
//获取图片
FileInputStream fileIn = new FileInputStream("E:\\lf.jpg");
//上传图片
int len = 0;
byte [] by = new byte[1024];
while((len=fileIn.read(by))!=-1){
out.write(by, 0, len);
}
socket.shutdownOutput();
//
InputStream in = socket.getInputStream();
len = in.read(by);
System.out.println(new String(by,0,len));
fileIn.close();
socket.close();
线程:
public class Upload implements Runnable {
private Socket socket;
public Upload(Socket s ){
this.socket = s;
}
@Override
public void run() {
try {
//拿到输入流
InputStream in = socket.getInputStream();
//随机文件名
String fileName =System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";
//确定文件的放置的位置
File upload = new File("c:\\upload");
//如果没有就创建
if(!upload.exists())
upload.mkdir();
//本地文件输出流
FileOutputStream file = new FileOutputStream(upload+File.separator+fileName);
//开始把拿到的文件 in.read(b) = 那文件数据 到 数组 b中 ,输出到本地文件夹中
int len = 0;//存放每次的字节长度
byte [] b = new byte[1024];
while((len = in.read(b))!=-1){
file.write(b,0,len);
}
//反向输出客户端通知上传图片成功
OutputStream out = socket.getOutputStream();
out.write("上传成功".getBytes());
file.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
服务端:
public class ThreadTCP {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while(true){
//等待socket
Socket socket = server.accept();
//等到了就开启一个线程
new Thread(new Upload(socket)).start();//一旦开始了,就开始下次的等待
}
}
}