Java网络编程

5 篇文章 0 订阅

网络编程

网络编程概述

一:网络编程中有两个主要的问题,

  • 1.如何准确的定位网络上一台或多台主机,定位主机上特定的应用
  • 2.找到主机后如何进行高效的数据传输

二:网路编程中的两个要素

  • 对应问题一:IP和端口号
  • 对应问题二:提供网络通信协议,TCP/IP参考模型

三:通信要素——IP和端口号

  • 1:Java中,使用InetAddress类代表IP

IP与端口

IP

使用InetAddress类代表IP

public static void main(String[] args) throws UnknownHostException {
    //通过静态方法返回InetAddress实例对象,参数可为IP地址,或者域名
    InetAddress inet1 = InetAddress.getByName("192.168.21.52");
    System.out.println(inet1);
    InetAddress inet2 = InetAddress.getByName("www.starryhk.cn");
    System.out.println(inet2);
    System.out.println(InetAddress.getLocalHost());
}

端口

不同的进程拥有不同的端口号

被规定为一个16位的整数 0~65535

端口分类

  • 公认端口:0~1023 被预定义服务通信占用的端口
  • 注册端口:1024~49151 分配给用户或应用程序
  • 动态/私有端口:49152~65535

端口号和IP地址的组合得出一个网络套接字Socket

TCP网络编程

案例1:客户端发送数据,服务器接收数据

//客户端
public void client() throws IOException {
    //设置IP
    InetAddress inet = InetAddress.getByName("127.0.0.1");
    //封装Socket,设置端口号
    Socket socket = new Socket(inet,25121);
    //定义输出流
    OutputStream os = socket.getOutputStream();
    //写数据
    os.write("我是客户端".getBytes());
    os.close();
    socket.close();
}
//服务端
public void server() throws IOException {
    //定义服务器端Socket,设置相同的端口
    ServerSocket ss = new ServerSocket(25121);
    //接受客户端的socket
    Socket socket = ss.accept();
    //设置输入流
    InputStream is = socket.getInputStream();
    //防止乱码,读取数据
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[20];
    int len;
    while((len = is.read(buffer))!=-1){
        baos.write(buffer,0,len);
    }
    //输出数据
    System.out.println(baos.toString());
    //获取客户端的地址
    System.out.println(socket.getInetAddress().getHostAddress());
    //关闭所有资源
    ....
}

案例二:客户端发送文件,服务器保存文件到本地

public void client() throws IOException {
    Socket socket = new Socket("127.0.0.1",3344);
    //获取输出流
    OutputStream os = socket.getOutputStream();
    //定义输入流,因为需要传文件,得读
    FileInputStream fr = new FileInputStream("ceshi.txt");
    byte[] buffer  = new byte[20];
    int len;
    while((len = fr.read(buffer))   !=-1){
        //写入
        os.write(buffer,0,len);
    }
    //关闭资源省略
}

public void server() throws IOException {
    ServerSocket serverSocket = new ServerSocket(3344);
    Socket accept = serverSocket.accept();
    InputStream is = accept.getInputStream();
    //定义输出流,因为要保存在本地
    FileOutputStream fos = new FileOutputStream("t.txt");
    byte[] buffer = new byte[20];
    int len;
    while((len = is.read(buffer))!=-1){
        fos.write(buffer,0,len);
    }
    //关闭资源省略
}

案例二:客户端发送文件,服务器保存文件到本地并提示客户端接收成功

public void client() throws IOException {
    Socket socket = new Socket("127.0.0.1",3344);
    //获取输出流
    OutputStream os = socket.getOutputStream();
    //定义输入流,因为需要传文件,得读
    FileInputStream fr = new FileInputStream("ceshi.txt");
    byte[] buffer  = new byte[20];
    int len;
    while((len = fr.read(buffer))   !=-1){
        //写入
        os.write(buffer,0,len);
    }
    //传输完数据,必须关闭掉,否则服务器端就会阻塞 
    socket.shutdownOutput();
    //------------------接受来自服务器端的反馈-----------------
    InputStream inputStream = socket.getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[]  buffere = new byte[20];
    int len1;
    while((len1 = inputStream.read(buffere))!=-1){
        baos.write(buffere,0,len1);
    }
    System.out.println(baos.toString());
    //关闭资源
}

public void server() throws IOException {
    ServerSocket serverSocket = new ServerSocket(3344);
    Socket socket = serverSocket.accept();
    InputStream is = socket.getInputStream();
    //定义输出流,因为要保存在本地
    FileOutputStream fos = new FileOutputStream("t.txt");
    byte[] buffer = new byte[20];
    int len;
    while((len = is.read(buffer))!=-1){
        fos.write(buffer,0,len);
    }
    //--------------服务器端给予客户端返回--------------
    OutputStream os = socket.getOutputStream();
    os.write("接受成功".getBytes());
    //关闭资源

}

UDP网络编程

DatagramSocket

DatagramPacket:用于存储UDP数据

public void sender() throws IOException {
    //定义UDPsocket
    DatagramSocket socket = new DatagramSocket();
    String str = "UDP方式发送";
    byte[] data = str.getBytes();
    InetAddress inet = InetAddress.getByName("127.0.0.1");
    //定义需要发送的数据
    DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,5555);
    //发送数据
    socket.send(packet);
    socket.close();

}
public void receiver() throws IOException {
    DatagramSocket socket = new DatagramSocket(5555);
    byte[] buf = new byte[100];
    //定义接受的数据
    DatagramPacket packet = new DatagramPacket(buf,0,buf.length);
    //接受
    socket.receive(packet);
    //输出
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    socket.close();
}

URL网络编程

public static void main(String[] args) throws MalformedURLException {
URL url = new URL("https://www.baidu.com");
System.out.println(url.getProtocol());//获取协议名
System.out.println(url.getHost());//主机名
System.out.println(url.getPort());//端口号
System.out.println(url.getPath());//文件路径
System.out.println(url.getFile());//文件名
System.out.println(url.getQuery());//查询名
}

资源下载

URL url = new URL("");
//打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//连接
connection.connect();
//获取到输入流
InputStream inputStream = connection.getInputStream();
//下载到本地
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值