ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

网络编程

2022-06-19 16:04:03  阅读:130  来源: 互联网

标签:java socket 编程 网络 new import net 客户端


网络编程

网络的概念

网络通信

1.概念:两台设备之间通过网络实现数据传输;

2.网络通信:将数据通过网络从一台设备传输到另一台设备

3.java.net包下提供了一系列的类或接口,完成网络通信

image


网络

1.概念:两台或多台设备通过一定物理设备连接起来构成了网络;

2.根据网络的覆盖范围不同,对网络进行分类:

​ 局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房;

​ 城域网:覆盖范围较大,可以覆盖一个城市;

​ 广域网:覆盖范围最大,可以覆盖全国甚至全球,万维网是广域网的代表;


网络通信协议

协议(Tcp/Ip):在网络编程中,数据的组织形式就是协议;

Tcp/Ip(Transmission Control Protocol/Internet Protocol)的简写,

中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单的说,就是由网络层的IP协议和传输层的TCP协议组成的


TCP网络通信编程

image


实例:客户端向服务发送hello,server,使用字节流

服务端:

package com.example.socket;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 14:57
 * @Version 1.0
 */
public class SocketTcp01Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的9999端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听9999
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端在9999端口监听,等待连接...");
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务端Socket返回=" + socket.getClass());
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        
        //4.IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;
        
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));//根据读取到的实际长度显示为字符串
            
        }
        //5.关闭流和socket
        serverSocket.close();
        socket.close();
        inputStream.close();
    
    }
}

客户端:

package com.example.socket;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:02
 * @Version 1.0
 */
public class SocketTcp01Client {
    public static void main(String[] args) throws IOException {
        //思路:
        //1.连接客户端(ip,端口)
        //2.解读:连接本机的9999端口,如果不是本机,可以时域名或者时ip地址
        //如果连接成功,返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        System.out.println("客户端Socket返回=" + socket.getClass());
        //3.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        //解释:字符串.getBytes表示将一个字符串转成一个字节数组
        outputStream.write("hello,server".getBytes());
        
        //4.关闭流对象和socket,必须关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出...");
    }
}

实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用字节流

客户端:

package com.example.socket2;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 */
public class SocketTcp02Client {
    public static void main(String[] args) throws IOException {
    
        //思路:
        //1.连接客户端(ip,端口)
        //2.解读:连接本机的8888端口,如果不是本机,可以是域名或者是ip地址
        //如果连接成功,返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
    
        //3.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,server".getBytes());
    
        //4.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();
        
        //5.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        int readLine = 0;
        byte[] buf = new byte[1024];
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));
        }
        
        //6.关闭流
        outputStream.close();
        inputStream.close();
        socket.close();
        
        
    }
}

服务端:

package com.example.socket2;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 * 根据字节流实现双方通信
 */
public class SocketTcp02Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的8888端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听8888
        ServerSocket serverSocket = new ServerSocket(8888);
        
        //2.当没有客户端连接8888端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
    
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
    
        //4.IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));
        }
    
        //5.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,client".getBytes());
    
        //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();
    
        //7.关闭流和socket
        serverSocket.close();
        socket.close();
        inputStream.close();
        outputStream.close();
        
    }
}

实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用字符流

package com.example.socket3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 * 根据字节流实现双方通信
 */
public class SocketTcp03Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的8888端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听8888
        ServerSocket serverSocket = new ServerSocket(8888);
        
        //2.当没有客户端连接8888端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
    
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
    
        //使用字符流来读取
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);
    
        //5.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,client 字符流");
        bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,注意:要求对方使用readLine()来读!!
        bufferedWriter.flush();//如果使用的是字符流需要手动刷新,否则数据不会写入数据通道
    
        //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();
    
        //7.关闭流和socket
        serverSocket.close();
        socket.close();
        bufferedReader.close();
        bufferedWriter.close();
        
    }
}

UDP网络通信编程

基本介绍:

  1. 类DatagramSocket和DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序
  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达。
  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
  4. UDP协议中每个数据报都给出了完整的地址信息,因此无须简历发送方和接收方的连接

image

实例:

UPD接收端:

package com.example.UDP;



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


/**
 * @Author 郜庆辉
 * @Time 2022/6/11 17:06
 * @Version 1.0
 * UPD接收端
 */
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(9999);
        //2.构建一个DatagramPacket对象,准备接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
        //3.调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        //注意:当有数据包发送到本机的9999端口时就会接收数据,没有数据报发送就阻塞等待
        System.out.println("接收端A等待接收数据");
        socket.receive(packet);
        //4.可以把packet进行拆包,取出数据并显示
        int length = packet.getLength();//实际收到的数据字节长度
        byte[] data = packet.getData(); //接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);
    
        //接收返回的数据好的明天见
        byte[] bytes1 = "好的明天见".getBytes();
        DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getByName("169.254.115.195"),9998);
        socket.send(packet1);
        
        socket.close();
    }
}

UPD发送端:

package com.example.UDP;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/11 17:05
 * @Version 1.0
 * UPD发送端
 */
public class UDPsenderB {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9998端口接接收
        DatagramSocket socket = new DatagramSocket(9998);
        
        //2.将需要发送的数据封装到DatagramPacket对象
        byte[] data = "明天吃火锅".getBytes();
        
        //说明:封装的DatagramPacket对象  data 内容字节数组,data.length  主机IP,端口
        DatagramPacket packet = new DatagramPacket(data,data.length, InetAddress.getByName("169.254.115.195"),9999);
        
        socket.send(packet);
    
        data = new byte[1024];
        DatagramPacket packet1 = new DatagramPacket(data,data.length);
        System.out.println("发送端B等待接收数据");
        socket.receive(packet1);
        
        int length = packet1.getLength();//实际收到的数据字节长度
        data = packet1.getData(); //接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);
        //关闭资源
        socket.close();
    }
   
}

标签:java,socket,编程,网络,new,import,net,客户端
来源: https://www.cnblogs.com/gaoqinghui/p/16390620.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有