• java中的网络编程


    知识点:

                   OSI参考模型和TCP/IP模型

                   TCP三次握手

                   TCP、UDP、URL编程

                   浏览器输入网址到显示页面的整个过程

        参考:https://www.cnblogs.com/midiyu/p/7875574.html           

     一 OSI参考模型和TCP/IP模型

             网络协议

     TCP三次握手

     

    TCP、UDP、URL编程

    (1)TCP编程

    实例1

    客户端发送消息到服务端,服务端接收消息后,发送消息返回给客户端

    //客户端给服务端发送消息,服务端接收到消息,并且发消息返回给客户端
    public class TCPTest1 {
    //客户端
    @Test
    public void Client (){
    Socket socket=null;
    OutputStream os=null;
    InputStream is=null;
    try {
    //1.创建一个Socket对象,通过构造器指明服务端IP地址,以及接收程序的端口号
    socket=new Socket(InetAddress.getByName("169.254.77.87"),8082);
    //2.getOutputStream():发送数据,方法返回OutputStream对象
    os=socket.getOutputStream();
    //3.输出内容
    os.write("我是客户端!".getBytes());
    //shutdownOutput():显示告诉服务器端发送完毕
    socket.shutdownOutput();

    //收到来自服务端的消息
    is=socket.getInputStream();
    byte[] b=new byte[40];
    int len;
    while ((len=is.read(b))!=-1){
    String str=new String(b,0,len);
    System.out.println(str);//输出 "我是服务端,已收到消息!"
    }

    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    //4.关闭流和socket对象
    if(os!=null){
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(socket!=null){
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    }

    //服务端
    @Test
    public void Server(){
    ServerSocket ss=null;
    Socket socket=null;
    InputStream is=null;
    OutputStream os=null;
    try {
    //1.创建一个ServerSocket对象,构造器指明自身端口
    ss=new ServerSocket(8082);
    //2.调用accept()方法,返回一个Socket对象
    socket=ss.accept();
    //3.调用socket对象的getInputStream()获取一个从客户端发送过来的输入流
    is=socket.getInputStream();

    //4.对获取的输入流操作
    byte[] b=new byte[20];
    int len;
    while ((len=is.read(b))!=-1){
    String str=new String(b,0,len);
    System.out.println(str);//输出 "我是客户端!"
    }
    //获得客户端IP地址
    System.out.println("消息来自于:"+socket.getInetAddress().getHostAddress());

    //给客户端发送消息
    os=socket.getOutputStream();
    os.write("我是服务端,已收到消息!".getBytes());

    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    //5.关闭相应的流和ServerSocket和Socket对象
    if (is!=null){
    try {
    is.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(os!=null){
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(socket!=null){
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(ss!=null){
    try {
    ss.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }

     控制台结果

         server端输出:

          client端输出 :

         

       实例2     

    客户端发送文件到服务端,服务端接收文件保存到本地,并发送“文件接收成功”消息到客户端

    /客户端发送文件到服务端,服务端接收文件保存到本地,并发送“成功消息”到客户端
    public class TCPTest2 {
    @Test
    public void Client(){
    Socket socket=null;
    FileInputStream fis=null;
    BufferedInputStream br=null;
    OutputStream os=null;
    InputStream is=null;
    try {
    //发送文件到服务端
    socket=new Socket(InetAddress.getByName("169.254.77.87"),8087);
    fis=new FileInputStream(new File("E:\test\io\1.png"));
    br=new BufferedInputStream(fis);

    os=socket.getOutputStream();
    byte[] b=new byte[1024];
    int len;
    while ((len=br.read(b))!=-1){
    os.write(b,0,len);
    }
    os.flush();/清空缓冲区内的数据,最后一次
    socket.shutdownOutput(); //显示告诉服务器端发送完毕

    //接收服务端返回的消息
    is=socket.getInputStream();
    byte[] b1=new byte[1024];
    int len1;
    while ((len1=is.read(b1))!=-1){
    String str=new String(b1,0,len1);
    System.out.println(str);
    }

    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if (is!=null){
    try {
    is.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (os!=null){
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (br!=null){
    try {
    br.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (fis!=null){
    try {
    fis.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (fis!=null){
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }


    }

    }

    @Test
    public void Server(){
    ServerSocket serverSocket=null;
    Socket socket=null;
    InputStream is=null;
    OutputStream os=null;

    FileOutputStream fos=null;
    BufferedOutputStream bos=null;
    try {
    //读取客户端发送的流
    serverSocket=new ServerSocket(8087);
    socket=serverSocket.accept();
    is=socket.getInputStream();

    //文件写入本地
    fos=new FileOutputStream(new File("E:\test\io\5.png"));
    bos=new BufferedOutputStream(fos);
    byte[] b=new byte[1024];
    int len;
    while ((len=is.read(b))!=-1){
    bos.write(b,0,len);
    }
    bos.flush();

    //输出客户端信息
    System.out.println("来自客户端"+socket.getInetAddress().getHostAddress()+"的文件!");

    //返回客户端发送成功消息
    os=socket.getOutputStream();
    os.write("服务端文件接收成功!".getBytes());

    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(os!=null){
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(bos!=null){
    try {
    bos.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(fos!=null){
    try {
    fos.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(is!=null){
    try {
    is.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(socket!=null){
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(serverSocket!=null){
    try {
    serverSocket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    }
    }

     控制台结果

         server端输出:


       cilent端输出:

       实例3   

    服务端接收多个客户端的请求,并打印请求内容

    //服务端接收多个客户端的请求
    public class TCP_Thread_Test1 {
    @Test
    public void server(){ //服务端
    int clientNo=1;

    ServerSocket serverSocket=null;
    try {
    serverSocket=new ServerSocket(7071);
    //创建线程池
    ExecutorService exec= Executors.newCachedThreadPool(); //Executors创建可缓存的线程池 https://www.cnblogs.com/shuaifing/p/11580337.html
    while(true){
    Socket socket=serverSocket.accept();
    exec.execute(new SingleServer(socket,clientNo));//线程池执行线程
    clientNo++;
    }
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(serverSocket!=null){
    try {
    serverSocket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    @Test
    public void client1(){ //客户端1
    Socket socket=null;
    OutputStream os=null;
    try {
    socket=new Socket(InetAddress.getByName("192.168.127.1"),7071);
    BufferedOutputStream bos=new BufferedOutputStream(os);
    os=socket.getOutputStream();
    os.write("我是客户端:".getBytes());
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(os!=null){
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(socket!=null) {
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    }
    }

    @Test
    public void client2(){ //客户端2
    Socket socket=null;
    OutputStream os=null;
    try {
    socket=new Socket(InetAddress.getByName("192.168.127.1"),7071);
    BufferedOutputStream bos=new BufferedOutputStream(os);
    os=socket.getOutputStream();
    os.write("我是客户端:".getBytes());
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(os!=null){
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(socket!=null) {
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    }
    }


    }

    class SingleServer implements Runnable{
    private Socket socket;
    private int clientNo;

    public SingleServer(Socket socket,int clientNo){
    this.socket=socket;
    this.clientNo=clientNo;
    }

    @Override
    public void run() {
    BufferedInputStream bis=null;
    try {
    bis=new BufferedInputStream(socket.getInputStream());
    byte[] b=new byte[1024];
    int len;
    while ((len=bis.read(b))!=-1){
    String str=new String(b,0,len);
    System.out.println(str+clientNo);//打印接收的客户端信息
    }
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(bis!=null){
    try {
    bis.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }

     控制台结果:

        server端输出:

    (2)UDP编程

     实例1

      发送端发送消息到接收端

    //UDP编程
    public class UDPTest {
    @Test
    public void send(){
    DatagramSocket socket=null;//socket套接字
    DatagramPacket packet=null;
    try {
    socket=new DatagramSocket();
    byte[] b="发送端发送的数据!".getBytes();

    packet=new DatagramPacket(b,0,b.length, InetAddress.getByName("169.254.77.87"),8084);//DatagramPacket数据包
    socket.send(packet);

    } catch (Exception e) {
    e.printStackTrace();
    }finally {
    socket.close();
    }
    }

    @Test
    public void receive(){
    DatagramSocket ds=null;
    try {
    ds=new DatagramSocket(8084);
    byte[] b=new byte[40];
    DatagramPacket dp=new DatagramPacket(b,0,b.length);
    ds.receive(dp);

    String str=new String(dp.getData(),0,dp.getLength());
    System.out.println("接收端收到消息:"+str);
    } catch (Exception e) {
    e.printStackTrace();
    }finally {
    ds.close();
    }

    }
    }

     控制台结果

         receive端输出:

    (2)URL编程

     实例1

    获取服务端资源,控制输出,同时输出数据到文件中

    public class URLTest {
    public static void main(String[] args) throws IOException {
    URL url=new URL("http://localhost:8087/examples/hello.txt");
    //获取服务端资源
    InputStream is=null;
    try {
    is=url.openStream();//网上读取数据
    byte [] b=new byte[20];
    int len;
    while ((len=is.read(b))!=-1){
    String str=new String(b,0,len);
    System.out.println(str);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(is!=null){
    try {
    is.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    //输出数据 URLConnection
    URLConnection urlcon=url.openConnection();
    InputStream is1=urlcon.getInputStream();
    FileOutputStream fos=new FileOutputStream(new File("E:/test/io/11.txt"));
    byte [] b1=new byte[20];
    int len1;
    while ((len1=is1.read(b1))!=-1){
    fos.write(b1,0,len1);
    }
    fos.close();
    is1.close();
    }
    }
  • 相关阅读:
    DFS初级算法题练习 POJ2488 POJ3009 POJ1088
    分支限界法基础练习笔记
    PuyoPuyo DFS算法练习
    回溯法基础练习笔记
    java基础:I/O流学习笔记
    synchronized锁的各种用法及注意事项
    20.04搭建ROS2
    西安 交建交通科技 招聘信息
    在.NET2.0中使用LINQ
    sqlite+VS2010+EF
  • 原文地址:https://www.cnblogs.com/shuaifing/p/11543437.html
Copyright © 2020-2023  润新知