【网络编程】Java中的Socket

这篇具有很好参考价值的文章主要介绍了【网络编程】Java中的Socket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【网络编程】Java中的Socket

前言

所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。


socket是什么?

一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。整个过程的大体的图示如下。
【网络编程】Java中的Socket
Socket 相当于是应用程序的大门,我们在网络中发送的报文都会经过这道大门才能够进入到应用程序中,让应用程序来使用报文中的数据。

要写网络程序就必须用Socket

  • 通信的两端要有Socket,是两台机器间通信的端点
  • 网络通信其实就是Socket间的通信

Java中的Socket

Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输,一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。
【网络编程】Java中的Socket
Java中的网络通信时通过Socket实现的,当我们需要通讯时(读写数据)

  • socket.getOutputStream():获取一个输出流

  • socket.getInputStream():获取一个输入流

客户端上的使用

  1. 客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
  2. 客户端的Socket对象上的getInputStream方法得到输入流其实就是从服务器端发回的数据。

服务器端上的使用

  1. 服务端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给客户端的数据。
  2. 服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。

Socket有两种编程方式

  • TCP编程(面向连接,可靠的)
  • UDP编程(无连接,不可靠)

Socket工作流程图:
【网络编程】Java中的Socket


Java实现网络上传文件

编写一个服务端和一个客户端,要求在某端口监听(端口可以自定义,前提是没有被占用,否则会报错)。客户端连接服务端,发送一张图片(本地磁盘的图片,可自定义);服务端收到客户端发来的图片,保存在服务端的项目工程目录src中(保存位置可自定义),之后发送收到图片并退出。客户端收到服务端发送的收到图片,在退出。

注意:理论上服务端和客户端的程序应该是在不同的机器上的,这里为了方便,使用了一台机器。所以使用了*InetAddress.getLocalHost() 获取本机IP,这里可以修改为其他主机IP地址

这里说一下用的部分知识点,如有疑问请自行百度进行查看

  • InetAddress.getLocalHost():获取本机的IP地址

  • serverSocket.accept():开始监听设置的端口,如果有连接则返回socket对象

  • BufferedOutputStream()和BufferedInputStream():字节处理流,包装

  • OutputStreamWriter(OutputStream o):将字节输出流转换为字符输出流

  • socket.shutdownInput()和socket.shutdownOutput分别为发送数据的输入/输出结束标记

  • 注意:StreamUtils类是自定义的工具类,其中streamToByteArray是将文件输入流转换为字节数组文件数据;streamToString将文件输入流转换为字符串数据(具体定义代码在下方)

整体演示流程图如下:
【网络编程】Java中的Socket

这里需要注意:如果使用字符流进行输出,则需要刷新或关闭,才能写入数据(此案例使用的字节流)

StreamUtils工具类

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 此类用于演示关于流的读写方法
 *
 */
public class StreamUtils {
	/**
	 * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]
	 * @param is
	 * @return
	 * @throws Exception
	 */
	public static byte[] streamToByteArray(InputStream is) throws Exception{
		ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
		byte[] b = new byte[1024];//字节数组
		int len;
		while((len=is.read(b))!=-1){//循环读取
			bos.write(b, 0, len);//把读取到的数据,写入bos	
		}
		byte[] array = bos.toByteArray();//然后将bos 转成字节数组
		bos.close();
		return array;
	}
	/**
	 * 功能:将InputStream转换成String
	 * @param is
	 * @return
	 * @throws Exception
	 */
	
	public static String streamToString(InputStream is) throws Exception{
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder builder= new StringBuilder();
		String line;
		while((line=reader.readLine())!=null){
			builder.append(line+"\r\n");
		}
		return builder.toString();	
	}
}

服务端

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

public class TCPFileUploadServer {
    public static void main(String[] args) throws Exception {
        //服务端在本机监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //等待连接
        Socket socket = serverSocket.accept();
        //读取客户端发送的数据,通过socket得到输入流
        BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);
        socket.shutdownInput();
        //将得到的bytes数组写入到服务端的指定位置
        String dest = "src\\test.png";
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(dest));
        bufferedOutputStream.write(bytes);
        //服务端给客户端发送回复
        bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
        bufferedOutputStream.write("收到图片".getBytes());
        //字符流方式
//        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//        bufferedWriter.write("收到图片");
//        bufferedWriter.flush();
//        socket.shutdownOutput();
        //关闭资源
        System.out.println("关闭服务端");
        bufferedOutputStream.close();
        bufferedInputStream.close();
        socket.close();
        serverSocket.close();
//        bufferedWriter.close();
    }
}

客户端文章来源地址https://www.toymoban.com/news/detail-464755.html

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TCPFileUploadClient {
    public static void main(String[] args) throws Exception {
        //客户端连接服务端9999端口
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        //创建读取磁盘文件的输入流
        String file = "E:\\test.png";
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
        //bytes就是对应的字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);
        //通过socket获取到一个输出流,将bytes数据发送到服务端
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
        bufferedOutputStream.write(bytes);
        socket.shutdownOutput();//写入数据的一个结束标记
        //接收服务端的回复
        bufferedInputStream = new BufferedInputStream(socket.getInputStream());
        String s = StreamUtils.streamToString(bufferedInputStream);
        System.out.println(s);
        socket.shutdownInput();
        //关闭资源
        System.out.println("关闭客户端");
        bufferedInputStream.close();
        bufferedOutputStream.close();
        socket.close();
    }
}

到了这里,关于【网络编程】Java中的Socket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java网络编程-Socket实现数据通信

    本文主要是为下一篇Websockt做铺垫,大家了解socket的一些实现。 网络编程是指利用计算机网络进行程序设计、开发的技术。网络编程主要包含三个要素,分别是: IP地址和端口号 传输协议 Socket 在计算机网络中,每台计算机都有一个IP地址,用于唯一标识该计算机在网络中的

    2024年02月10日
    浏览(45)
  • Java网络编程基础:TCP Socket套接字编程 IntAddress UDP等...

    目录 一,网络基础 1.IP地址 2.端口 3.TCP/UDP协议 4.网络编程开发模式  二,基于套接字的Java网络编程 1.Socket  2.InetAddress 三.基于TCP的Socket网络编程 1.单服务器端与单Socket客户端一次通讯 2.单服务器端接收多次通讯  3.TCP网络通讯补充 四,基于UDP的网络编程 1. DatagramSocket:收发

    2024年04月29日
    浏览(46)
  • 计算机网络技术与JAVA网络编程手写Socket聊天室-----JAVA入门基础教程-----计算机网络经典

    import java.io.*; import java.net.Socket; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket(\\\"127.0.0.1\\\",9090); new Thread(new Runnable() { @Override public void run() { InputStream inputStream = null; while(true) { try { inputStream = socket.getInputStream(); } catch (IOException e)

    2024年02月15日
    浏览(61)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(79)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(71)
  • Java网络编程(二)Socket 套接字(TCP和UDP),以及TCP的回显

    我们软件工作者,着重编写的是应用层的代码,但是发送这个数据,我们就需要将应用层传输到传输层,也就意味着我们需要调用应用层的API,统称为 Socket API。 套接字的分类: 流套接字:使用传输层TCP协议 特点: 有连接:使用 TCP 通信的双方,需要时刻保存对方的相关消

    2024年02月09日
    浏览(54)
  • 【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

    TCP提供的API主要是两个类:ServerSocket 和 Socket . TCP不需要一个类来表示\\\"TCP数据报\\\"因为TCP不是以数据报为单位进行传输的.是以字节的方式,流式传输 ServerSocket API ServerSocket 是专门给服务器使用的Socket对象. ServerSocket 构造方法: ServerSocket(int port) 创建一个服务端流套接字Socket,并绑

    2024年02月12日
    浏览(62)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(47)
  • 【Java基础教程】(四十七)网络编程篇:网络通讯概念,TCP、UDP协议,Socket与ServerSocket类使用实践与应用场景~

    了解多线程与网络编程的操作关系; 了解网络程序开发的主要模式; 了解 TCP 程序的基本实现; 在Java中,网络编程的核心意义是实现不同电脑主机之间的数据交互。Java采用了一种简化的概念,将这个过程进一步抽象为JVM(Java虚拟机)进程之间的通信。可以在同一台电脑上

    2024年02月15日
    浏览(67)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包