Java网络编程

Java网络编程

目录

网络编程中的核心问题

网络编程概述

网络模型

网络通信要素

TCP

UDP

TCP编程

UDP编程

网络编程中的核心问题

计算机网络:

把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统.

网络编程概述

java是Internet上的语言,他从语言级上提供了对网络应用程序的支持,.程序员能够很容易开发常见的网络应用程序.

Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制,并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境

网络编程中的核心问题

如何精确找到计算机网络中的目标主机 IP+端口

IP 计算机的地址 IPv4 IPv6

端口 对应的是计算机上的一个进程

IP端口 找到某台主机+找到主机上的某个程序

找到后如何安全可靠的传输数据 协议

网络模型

OSI 参考模型 把网络分为7层 理想实现

TCP/IP模型 分为4层 实际实现

 

网络通信要素

网络编程有三个要素分别是:IP地址,端口号,和通信协议

IP地址(Internet Protocol Address)是指互联网协议地址,又译为国际协议地址.网络中的计算机使用IP地址来进行唯一标识.

在Windows系统下,打开cmd,输入命令ipconfig,按回车即可查看.

本地回环地址(hostAddress):127.0.0.1,它代表设备的本地虚拟接口

端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序

0~1024未被系统使用或保留的端口号,0~65535为有效的端口号,也就是说我们要对一些程序定义端口号的时候,要选择1024~65535范围内的整数数字

比如,以前学过的MySQL的端口号是3306,SQLServer的端口号是1433,查了一下Oracle的端口号是1521

网络通信协议

计算机网络中实现通信必须要有一些约定,即通信协议,对速率,传输代码,代码结构,传输控制步骤,出错控制等制定标准

传输层协议中有两个非常重要的协议:

传输控制协议TCP(Transmission Control Protocol)

用户数据报协议UDP(User Datagram Protocol)

TCP

使用TCP协议前,须先建立TCP连接,形成传输数据通道

传输前,采用"三次握手"方式,是可靠的

TCP协议进行通信的两个应用进程:客户端,服务端

在连接中可进行大数据量的传输

传输完毕,需释放已建立的连接,效率低

在断开时要进行"四次挥手"

 

 

UDP

将数据,源,目的封装成数据包,不需要建立连接

每个数据包的大小限制在64k内

因无需连接,故是不可靠的

发送数据结束时无需释放资源,速度快

TCP编程

利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准

通信的两端都要有Socket,是两台机器间通信的端点

网络通信其实就是Socket间的通信

Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

Socket常用方法

 

ServerSocket常用方法

 

客户端Socket的工作过程包含以下四个基本的步骤

创建Socket:根据指定服务端的IP地址或端口号构造Socket类对象,若服务器端响应,则建立客户端到服务器的通信线路,若连接失败,会出现异常

打开连接到Socket的输入/出流;使用getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输

按照一定的协议对Socket进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程

关闭Socket:断开客户端到服务器的连接,释放线路

客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器发起连接,Socket的构造方法是:

Socket(String host,int port)throws

UnknownHostException,IOException:向服务器(域名是host,端口号为port)发起TCP连接,若成功,则创建Socket对象,.否则抛出异常

Socket(InetAddress address,int port)throws IOException:根据InetAddress对象所表示的IP地址以及端口号port发起连接

Socket s=new Socket("192.168.40.165",9999);

OutputStream out=s.getOutStream();

out.write("hello".getBytes());

s.close();

服务器程序的工作过程包含以下四个基本的步骤:

调用ServerSocket(int port):创建一个服务器套接字,并绑定到指定端口上,用于监听客户端的请求

调用accept():监听连接请求,如果客户端请求,则接受连接,返回通信套接字对象

调用该Socket类对象的getOutputStream()和getInputStream();获取输出流和输入流,开始网络数据的发送和接受.

关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字

服务器建立ServerSocket对象

ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员,也就是,服务器必须事先建立一个等待客户端请求建立套接字连接的ServerSocket对象

所谓"接收"客户的套接字请求,就是accept()方法会返回一个Socket对象

ServerSocket as=new ServerSocket(9999);

Socket s=ss.accept();

InputStream in=s.getInStream();

byte[] buf=new byte[1024];

int num=in.read(buf);

String str=new String(buf.0.num);

System.out.println(s.getInetAddress().toString+":"+str);

s.close();

ss.close();

UDP编程

类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序

UDP数据报通过数据报套接字DatagramSocket发送和接收,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号

UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

流程:

A.DatagramSocket与DatagramPacket

B.建立发送端,接收端

C.建立数据报

D.调用Socket的发送,接收方法

E.关闭Socket

发送端与接收端是两个独立的运行程序

发送端

DatagramSocket ds=new DatagramSocket();

byte[] by="hello,baidu.com".getBytes();

DatagramPacket dp=new DatagramPacket(by,0,by.length,InetAddress.getByName("127.0.0.1"),10000);

ds.send(dp);

ds.close();

接收端,要指定监听的窗口

DatagramSocket ds=new DatagramSocket(10000);

byte[] by=new byte[1024];

DatagramPacket dp=new DatagramPacket(by,by.length);

ds.receive(dp);

String str=new String(dp.getData(),0,dp.getlength());

System.out.println(str+"--"+dp.getAddress());

ds.close();

代码案例:

服务器建立ServerSocket对象

ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员,也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象

所谓"接收"客户的套接字请求,就是accept()方法会返回一个Socket对象

一.

package com.ffyc.javaNetWorkDemo.Demo1;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        //创建客户端socket  创建时就会连接服务器,检查网络是否通畅
        Socket socket=new Socket("127.0.0.1",9999);
        OutputStream out= socket.getOutputStream();
        out.write("你好服务器".getBytes("utf-8"));
    }
}

package com.ffyc.javaNetWorkDemo.Demo1;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try{
            //创建服务器
            ServerSocket  serverSocket=new ServerSocket(9999);
            System.out.println("服务器启动成功,等待客户端连接");
            //监听客户端连接
            Socket socket= serverSocket.accept();//监听是阻塞式的,直到有客户端连接上来,才继续向下执行
            System.out.println("客户端连接成功");
            //接受客户端发送的信息
            InputStream  in=socket.getInputStream();
            byte[] b=new byte[100];
            int size=in.read(b);//15
            String s1=new String(b,0,size,"utf-8");
            System.out.println("客户端说:"+s1);
        }catch(BindException | UnsupportedEncodingException bindException){
            System.out.println("端口已被占用");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

二.

package com.ffyc.javaNetWorkDemo.Demo2;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",9999);
        //DataOutputStream数据输出字节流(处理流)
        DataOutputStream  dataOut=new DataOutputStream(socket.getOutputStream());
        dataOut.writeUTF("你好,服务器!");
        DataInputStream  datain=new DataInputStream(socket.getInputStream());
        System.out.println("服务器说:"+datain.readUTF());
    }
}
 

package com.ffyc.javaNetWorkDemo.Demo2;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(9999);
        Socket socket= serverSocket.accept();
        //接受客户端发送的信息
        DataInputStream datain=new DataInputStream(socket.getInputStream());
        String msg=datain.readUTF();
        System.out.println("客户端说:"+msg);
        //向客户端回复信息
        DataOutputStream  dataOut=new DataOutputStream(socket.getOutputStream());
        dataOut.writeUTF("你好,客户端");
    }
}
 

三.

package com.ffyc.javanetwork.demo3;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Receive {

    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket  = new DatagramSocket(9999);
        byte[] b = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(b,b.length);
        datagramSocket.receive(datagramPacket);
          String msg = new String(datagramPacket.getData(),0,datagramPacket.getLength(), "utf-8");
          System.out.println(msg);
    }
}
 

package com.ffyc.javanetwork.demo3;

import java.io.IOException;
import java.net.*;

public class Send {

    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket  = new DatagramSocket();
        byte[] b="你好接收端".getBytes("utf-8");
        DatagramPacket datagramPacket = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),9999 );
        datagramSocket.send(datagramPacket);
    }

}
.引入循环与Scanner, 
  实现客户端向服务器端发送消息,服务器端接收消息,
  并在服务器端向客户端返回一条消息,并在客户端打印输出.
  实现多次发送

package com.ffyc.javaNetWorkDemo.HM5;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);
        //创建客户端socket   创建时就会连接服务器,检查网络是否通畅
        Socket socket=new Socket("192.168.31.23",9876);
        while (true){
            DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
            DataInputStream  dataInputStream=new DataInputStream(socket.getInputStream());
            String  s= scanner.next();
            dataOutputStream.writeUTF(s);

            String s1=dataInputStream.readUTF();
            System.out.println("服务器(在线):"+s1);
        }

    }
}
package com.ffyc.javaNetWorkDemo.HM5;



import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) {
        try {
            Scanner scanner = new Scanner(System.in);
            //创建服务器
            ServerSocket serverSocket = new ServerSocket(9989);
            System.out.println("服务器启动成功,等待客户端连接");
            //监听客户端连接
            Socket socket = serverSocket.accept();//监听是阻塞式的,直到有客户端连接,才继续向下执行
            System.out.println("客户端连接成功");
            //接受客户端发送的信息
            while (true) {
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());

                String s = dataInputStream.readUTF();
                System.out.println("客户端(在线):" + s);

                String s1 = scanner.next();
                dataOutputStream.writeUTF(s1);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

.实现从客户端向服务器发送文件,发送完成后,服务器回复发送成功,客户端接收打印信息.
 

package com.ffyc.javaNetWorkDemo.HM6;

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        //创建客户端socket  创建时就会连接服务器,检查网络是否通畅
        Socket socket=new Socket("127.0.0.1",11023);
        DataOutputStream out=new DataOutputStream(socket.getOutputStream());
        DataInputStream in=new DataInputStream(socket.getInputStream());
        System.out.println("客户端向服务器端发送文件:");
        File f=new File("D:\\aaa\\cc\\kkk.txt");
        FileInputStream  fileInputStream=new FileInputStream(f);
        BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
        int size=0;
        byte[]  bytes=new byte[1024*1024];
        while ((size=bufferedInputStream.read())!=-1){
            out.write(bytes,0,size);
        }
        in.close();
        fileInputStream.close();
        out.flush();
        out.close();
    }
}
package com.ffyc.javaNetWorkDemo.HM6;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //创建服务器
        ServerSocket serverSocket=new ServerSocket(11023);
        System.out.println("服务器创建成功");
        //监听客户端连接
        System.out.println("客户端已连接");
        Socket socket=serverSocket.accept();
        //接受信息
        DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
        File file=new File("");
        FileOutputStream  fileOutputStream=new FileOutputStream(file);
        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
        int size=0;
        byte[]  bytes=new byte[1024*1024];
        while((size=dataInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,size);
        }
        fileOutputStream.flush();
        bufferedOutputStream.close();
        fileOutputStream.close();
        dataInputStream.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java网络编程是一种通过使用Java编程语言,在计算机网络上实现通信的技术。它涉及到协议、IP地址和端口号等三个重要要素。Java编写的应用程序可以在单个计算机上运行,也可以在网络的服务器端和客户端上分布运行。此外,Java还可以用于编写小型应用程序模块或applet,作为网页的一部分使用。applet可以嵌入网页中,并在浏览器中运行。在Java中,使用URI可以代表绝对的或相对的资源,而URL则包含了定位资源的信息,并且不能是相对的。Java提供了一系列的类和接口,例如InetAddress、Socket、ServerSocket、URL和URLConnection等,用于实现各种网络应用。通过使用这些类和接口,可以创建连接客户端和服务器之间的套接字,并实现面向连接的通信,保证数据的可靠传输。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java网络编程](https://blog.csdn.net/weixin_42784609/article/details/130388655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [超详细入门到精通自学视频课程(阶段01:JavaSE基础02 编程思维编程思维和编程能力、综合应用专题-04、案例...](https://download.csdn.net/download/weixin_54787054/88224199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [网络编程](https://blog.csdn.net/zhixingwu/article/details/103226003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个想挣钱的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值