网络编程技术

本文涉及的产品
系统运维管理,不限时长
简介: config查看本机的IP地址ping命令测试网络是否通畅网络是连接在一起共享数据和资源的计算机按照覆盖范围可以分为:局域网、城域网、广域网ping 127.0.0.1检查TCP/IP协议安装是否正确

1、查看本机的IP地址和网络相关概念

config查看本机的IP地址
ping命令测试网络是否通畅
网络是连接在一起共享数据和资源的计算机
按照覆盖范围可以分为:局域网、城域网、广域网
ping 127.0.0.1检查TCP/IP协议安装是否正确

2、基于TCP协议的网络编程

①建立连接
②打开socket关联的输入/输出流
③从流中读取信息
④关闭流和socket

注意点:
1、先写服务器,再写客户端
2、在客户端输出部分要加socket.shutdownOutput()(相当于告诉服务器我说的话说完了),若用字符流写,需要在socket.shutdownOutput()前面加上flash方法,清空缓存
3、本机localhost
4、端口号不低于1024

三、实例

1、客户端发送的请求为String字符串

package demo1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
 * 服务器
 */
public class LoginServece {
  public static void main(String[] args) throws Exception {
    //建立连接
    ServerSocket serverSocket= new ServerSocket(8000);
    Socket socket =serverSocket.accept();
    //打开输入流
    InputStream is=socket.getInputStream();
    //读
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String info=null;
    while((info=br.readLine())!=null) {
      System.out.println("我是服务器,客户端说:"+info);
    }
    // 给回应
    String reply ="我是服务器,欢迎登陆";
    OutputStream os=socket.getOutputStream();
    os.write(reply.getBytes());
    //关闭资源
    os.close();
    br.close();
    is.close();
    socket.close();
  }
}
package demo1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/*
 * 客户端
 */
public class LoginClient {
  public static void main(String[] args) throws Exception, IOException {
    Socket socket = new Socket("localhost", 8000);
    // 发送请求
    OutputStream os = socket.getOutputStream();
    String info = "姓名:jim  密码12345";
    os.write(info.getBytes());
    socket.shutdownOutput();
    // 读回应
    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String replu = null;
    while ((replu = br.readLine()) != null) {
      System.out.println("我是客户端,服务器说:" + replu);
    }
    br.close();
    is.close();
    os.close();
    socket.close();
  }
}

2、客户端传出的是一个对象的情况
需要将对象序列化,注意要实现Serializable接口

package demo2;
import java.io.Serializable;
public class User implements Serializable{
  private String name;
  private String psd;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getPsd() {
    return psd;
  }
  public void setPsd(String psd) {
    this.psd = psd;
  }
  public User() {
    super();
    // TODO Auto-generated constructor stub
  }
  public User(String name, String psd) {
    super();
    this.name = name;
    this.psd = psd;
  }
  @Override
  public String toString() {
    return "用户名:"+this.getName()+"\t"+"密码:"+this.getPsd();
  }
}
package demo2;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
 * 服务器
 */
public class LoginServece {
  public static void main(String[] args) throws Exception {
    //建立连接
    ServerSocket serverSocket= new ServerSocket(8000);
    Socket socket =serverSocket.accept();
    //打开输入流
    InputStream is=socket.getInputStream();
    //读
    ObjectInputStream ois = new ObjectInputStream(is);
    User user=(User) ois.readObject();
    System.out.println(user);
    // 给回应
    OutputStream os=socket.getOutputStream();
    String reply ="我是服务器,欢迎登陆";
    os.write(reply.getBytes());
    //关闭资源
    os.close();
    ois.close();
    is.close();
    socket.close();
  }
}
package demo2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
 * 客户端
 */
public class LoginClient {
  public static void main(String[] args) throws Exception, IOException {
    Socket socket = new Socket("localhost", 8000);
    // 发送请求
    OutputStream os = socket.getOutputStream();
    ObjectOutputStream oos =new ObjectOutputStream(os);
    User user =new User("Jack", "123456");
    oos.writeObject(user);
    // 读回应
    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String replu = null;
    while ((replu = br.readLine()) != null) {
      System.out.println("我是客户端,服务器说:" + replu);
    }
    os.close();
    oos.close();
    socket.close();
  }
}

3、利用多线程实现多个客户端发出请求情况
①创建服务器线程类,run()方法实现对一个请求的响应处理
②死循环让服务器一直处于监听状态
③服务器每监听一个线程,创建一个线程对象并启动

package demo3;
import java.net.ServerSocket;
import java.net.Socket;
/*
 * 服务器
 */
public class LoginServece {
  public static void main(String[] args) throws Exception {
    //建立连接
    ServerSocket serverSocket= new ServerSocket(8000);
    Socket socket;
    while(true) {
      socket=serverSocket.accept();
      MyThread thread =new MyThread(socket);
      thread.start();
    }
  }
}
package demo3;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MyThread extends Thread{
  private Socket socket;
  public MyThread(Socket socket) {
    this.socket = socket;
  }
  @Override
  public void run() {
    //打开输入流
        InputStream is=null;
        ObjectInputStream ois=null;
        OutputStream os=null;
        try {
          is = socket.getInputStream();
          //读
          ois = new ObjectInputStream(is);
          User user=(User) ois.readObject();
          System.out.println(user);
          // 给回应
          os=socket.getOutputStream();
          String reply ="我是服务器,欢迎登陆";
          os.write(reply.getBytes());
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } catch (ClassNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }finally {
          //关闭资源
          try {
            os.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          try {
            ois.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          try {
            is.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          try {
            socket.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
  }
}
package demo3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/*
 * 客户端
 */
public class LoginClient22 {
  public static void main(String[] args) throws Exception, IOException {
    Socket socket = new Socket("localhost", 8000);
    // 发送请求
    OutputStream os = socket.getOutputStream();
    ObjectOutputStream oos =new ObjectOutputStream(os);
    User user =new User("good", "111111");
    oos.writeObject(user);
    // 读回应
    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String replu = null;
    while ((replu = br.readLine()) != null) {
      System.out.println("我是客户端,服务器说:" + replu);
    }
    os.close();
    oos.close();
    socket.close();
  }
}

四、InetAddress类

位于java.net包中,常用于封装IP地址和DNS
静态方法
InetAddress.getByName(String hostName)
返回指定主机名的InetAddress对象

五、基于UDP协议的socket编程

四个步骤
1、DatagramPacket对象封装数据包
2、DatagramSocket发送数据包
3、DatagramSocket接收数据包
4、DatagramPacket处理数据包
TCP和UDP协议的异同

实现实例:

package socket4;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
 * 基于UDP协议的网络编程
 */
public class LoginnServerce {
  public static void main(String[] args) {
    DatagramSocket socket=null;
    try {
      //接收客户端发过来的请求
      //1、建立一个空包用来收
      byte[] b =new byte[1024];
      DatagramPacket dp = new DatagramPacket(b, b.length);
      //2、创建DatagramSocket,(快递点)
      socket =new DatagramSocket(8000);
      //3、收数据
      socket.receive(dp);
      //读取数据
      String info = new String(dp.getData(),0,dp.getData().length);
      System.out.println("客户端说:"+info);
      //给客户端一个响应
      String reply = "我是服务器,你好,客户端!";
      DatagramPacket dp1=new DatagramPacket(reply.getBytes(), reply.getBytes().length, InetAddress.getByName("localhost"), 8000);
      //不用再创建socket
      socket.send(dp1);
    } catch (SocketException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally {
      if(null!=socket) {
        socket.close();
      }
    }
  }
}
package socket4;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/*
 * 客户端
 */
public class LoginClient {
  public static void main(String[] args) {
    String info="你好啊,服务器!";
    byte[] infos=info.getBytes();
    //获得一个InetAddress
    InetAddress address;
    DatagramSocket socket=null;
    try {
      address = Inet4Address.getByName("localhost");
      //建立一个包裹封装数据
      DatagramPacket dp =new DatagramPacket(infos,infos.length,address,8000);
      //建立快递点
      socket =new DatagramSocket();
      //通过快递点发送数据
      socket.send(dp);
      //接收服务器发来的信息
      //创建一个空包接收
      byte[] b = new byte[1024];
      DatagramPacket dp1 =new DatagramPacket(b, b.length);
      socket.receive(dp1);
      // 读取信息
      String reply = new String(dp1.getData(), 0, dp1.getData().length);
      System.out.println(reply);
    } catch (UnknownHostException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SocketException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally {
      socket.close();
    }
  }
}
目录
相关文章
|
4天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的未来之路
【10月更文挑战第30天】在数字化浪潮的推动下,云计算已成为企业信息技术架构的核心。然而,随之而来的网络安全问题也日益凸显。本文将探讨云计算与网络安全的关系,分析云服务中的安全挑战,并提出相应的解决方案。我们将通过实例展示如何在云计算环境中实现网络安全的最佳实践,以期为读者提供一条技术融合的未来之路。
|
1天前
|
机器学习/深度学习 移动开发 自然语言处理
HTML5与神经网络技术的结合有哪些其他应用
HTML5与神经网络技术的结合有哪些其他应用
10 3
|
5天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
【10月更文挑战第28天】本文旨在探索云计算在提供便利和效率的同时,如何成为网络安全领域的一大挑战。我们将从云服务的基本架构出发,分析其在信息安全中的关键作用,进而讨论当前网络安全面临的主要威胁及防御策略。文章还将探讨云计算环境中的数据保护、身份验证和访问控制机制,以及如何通过加密技术和安全协议来增强安全性。最后,我们将展望未来云计算与网络安全的发展趋势,并思考如何平衡技术创新与安全需求。
|
1天前
|
机器学习/深度学习 移动开发 自然语言处理
HTML5与神经网络技术的结合有哪些
HTML5与神经网络技术的结合有哪些
10 2
|
2天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的新篇章
【10月更文挑战第31天】本文将深入探讨云计算与网络安全之间的紧密联系,揭示云服务在信息安全领域的关键作用。文章将通过分析网络安全的挑战、云服务的机遇以及信息安全的未来趋势,为读者提供一个全面的视角。同时,文章还将展示如何通过实际的技术手段和策略来增强云计算环境下的安全性。
9 1
|
5天前
|
存储 安全 网络安全
云计算与网络安全:探索云服务中的信息安全技术
【10月更文挑战第29天】在数字化时代的浪潮中,云计算作为一种革命性的技术,正日益成为企业和个人数据存储与处理的首选方案。然而,随之而来的网络安全问题也愈发复杂和严峻。本文将深入探讨云计算服务中的网络安全挑战,并分析如何通过先进的信息安全技术来加强保护措施。我们将从云服务的基础知识出发,逐步深入到网络安全的各个方面,包括数据加密、身份验证、访问控制等关键技术的应用。通过理论与实践的结合,旨在为读者提供一套全面而实用的云计算安全指南。
|
7天前
|
运维 安全 5G
|
8天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
8天前
|
机器学习/深度学习 人工智能 算法
|
8天前
|
安全 网络协议 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!

热门文章

最新文章