网络编程技术

本文涉及的产品
系统运维管理,不限时长
简介: 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();
    }
  }
}
目录
相关文章
|
16天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的未来之路
【10月更文挑战第30天】在数字化浪潮的推动下,云计算已成为企业信息技术架构的核心。然而,随之而来的网络安全问题也日益凸显。本文将探讨云计算与网络安全的关系,分析云服务中的安全挑战,并提出相应的解决方案。我们将通过实例展示如何在云计算环境中实现网络安全的最佳实践,以期为读者提供一条技术融合的未来之路。
|
7天前
|
云安全 安全 网络安全
云计算与网络安全:技术挑战与解决策略
【10月更文挑战第39天】随着云计算技术的飞速发展,网络安全问题也日益凸显。本文将探讨云计算环境下的网络安全挑战,并提出相应的解决策略。通过分析云服务模型、网络安全威胁以及信息安全技术的应用,我们将揭示如何构建一个安全的云计算环境。
|
7天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
22 2
|
8天前
|
云安全 安全 网络安全
云计算与网络安全:技术融合的未来之路
【10月更文挑战第38天】 在数字化浪潮中,云计算和网络安全成为支撑现代企业和个人数据安全的两大基石。本文将深入探讨云计算服务如何与网络安全技术相结合,保障信息安全,并分析面临的挑战及未来发展趋势。我们将通过实际案例,揭示云安全的最佳实践,为读者提供一条清晰的技术融合路径。
|
9天前
|
安全 网络安全 数据库
云计算与网络安全:技术融合的未来之路
【10月更文挑战第37天】本文将探讨云计算与网络安全的交汇点,揭示它们如何共同塑造信息安全的未来。我们将深入了解云服务的核心组件、网络安全的关键策略以及两者如何相互增强。通过分析当前的挑战和未来的趋势,本文旨在为读者提供一条清晰的路径,以理解并应对这一不断发展的技术领域。
|
10天前
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
39 5
|
11天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
【10月更文挑战第35天】本文将探讨云计算与网络安全的交叉点,包括云服务、网络安全和信息安全等技术领域。我们将深入了解云计算的基本概念,以及如何通过云服务实现网络安全和信息安全。同时,我们还将讨论云计算面临的安全挑战,并提出相应的解决方案。最后,我们将通过代码示例展示如何在云计算环境中实现网络安全和信息安全。
27 3
|
12天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的深度剖析
【10月更文挑战第34天】本文将深入探讨云计算与网络安全的关系,包括云服务、网络安全、信息安全等技术领域。我们将通过实例和代码示例,解析云计算如何改变网络安全的格局,以及如何在云计算环境下保护信息安全。我们将从云计算的基本概念开始,然后深入到网络安全和信息安全的主题,最后通过代码示例来展示如何在云计算环境下实现网络安全和信息安全。
|
13天前
|
供应链 安全 网络安全
区块链技术与网络安全:机遇与挑战
区块链技术与网络安全:机遇与挑战
42 2
|
14天前
|
机器学习/深度学习 移动开发 自然语言处理
HTML5与神经网络技术的结合有哪些其他应用
HTML5与神经网络技术的结合有哪些其他应用
31 3