JAVA Socket编程

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

aliases: []
tags   : " "
summary: [基于TCP/IP和UDP协议的Java Socket网络通信编程]
author : [yaenli]
notekey: [20230512-143738]

Socket 网络模型

Socket编程是在TCP/IP、UDP协议上的网络编程,在此之前,先了解下常见的网络模型:

  1. OSI七层模型与TCP模型
    JAVA Socket编程

  2. OSI七层模型详解(OSI七层模型详解)
    JAVA Socket编程

Socket就在应用程序的传输层和应用层之间的一个抽象层:

JAVA Socket编程

Socket 知识

Socket概述

  • 在计算机网络编程技术中,两个进程或者说两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(Socket)。
  • Socket 是网络驱动层提供给应用程序的一个接口或者说一种机制。
  • Socket 方便了应用程序访问通讯协议TCP/IP、UDP 。
  • 我们可以把套接字看成是 电话机,有了套接字,才有了通讯的工具。我们可以把IP地址看成是话号码, 端口号看成是分机号。

Java中Socket的实现

Socket的底层机制非常复杂,Java平台提供了一些简单但是强大的类,可以简单有效地使用Socket开发通信程序而无须了解底层机制。

java.net包提供了若干支持基于套接字的客户端/服务器通信的类:

ServerSocket 类用来创建 TCP/IP 服务器端;
Socket 类用来创建 TCP/IP 客户端;
DatagramSocket 类用来实现 UDP 协议的客户端和服务器套接字;
DatagramPacket 类用来封装、处理 UDP 协议的数据包;
InetAddress 类用于封装IP和DNS等地址信息,在创建数据报报文和 Socket 对象时,可以使用。

Socket 编程

基于TCP/IP协议的Socket编程

(1)分别使用java.net.Socket和ServerSocket来创建客户端和服务器端套接字,它们是基于TCP协议进行工作的,工作过程如同打电话的过程,只有双方都接通了,才能开始通话。
(2)基于TCP创建的套接字叫做 流套接字。Socket通过数据流来完成数据的传递工作。
(3)Socket编程中,遵循client-server模型。服务器端相当于一个监听器,用来监听端口。

相关类

  • Socket 类:用构造方法创建套接字,并将此套接字连接至指定的主机和端口。
// 常用构造
public Socket(@Nullable  String host, int port ) throws UnknownHostException, IOException ;
public Socket(InetAddress address, int port ) throws IOException ;

// 常用方法
public void connect(SocketAddress host, int timeout) throws IOException;// 将此套接字连接到服务器,并指定一个超时值。
public InetAddress getInetAddress(); // 返回远程IP信息
public int getPort(); // 返回远程端口
public int getLocalPort(); // 返回本地端口
public InputStream getInputStream(); // 获取输入流
public OutputStream getOutputStream(); // 获取输出流
public void close() throws IOException // 关闭此套接字
  • ServerSocket 类:等待客户端建立连接,连接建立以后进行通信。
// 常用构造方法
public ServerSocket(int port) throws IOException; // 创建指定端口的服务器套接字
public ServerSocket(int port, int backlog) throws IOException; // 指定最大连接队列
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException; // 指定绑定的本地ip地址

// 常用方法:Socket中的方法都能适用,除此之外,还有以下方法
public Socket accept() throws IOException // (阻塞方法)侦听连接请求,并返回一个新的通信套接字,该 Socket 连接到客户端的 Socket
public void bind(SocketAddress host, int backlog) // 将ServerSocket绑定到特定地址

开发流程

JAVA Socket编程

详细交互过程:

JAVA Socket编程

服务端编程步骤:

  1. 实例化ServerSocket 对象,绑定指定端口;
  2. 调用 accept(),监听连接请求(阻塞等待),并返回通信Socket
  3. Socket 获取输出流输入流,从输入流中读取请求信息,向输出流中写入响应信息;
  4. 关闭数据流和通信套接字。

客户端编程步骤:

  1. 实例化 Socket 对象,连接到指定服务器端;
  2. Socket 获取输出流输入流,向输出流中写入请求信息,从输入流中读取响应信息;
  3. 关闭数据流和通信套接字。

客户端和服务器端的交互,采用一问一答的模式,先启动服务器进入监听状态,等待客户端的连接请求,连接成功以后,客户端先 “发言”,服务器给予 “回应”。

示例代码

采用多线程的方式,实现一个服务端响应多个客户端请求。

服务端代码: 使服务器端Socket一直处于监听状态。服务器端每监听到一个请求,创建一个线程对象并启动。

import java.net.*;
import java.io.*;
 
public class SocketServer {
	
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		try {
			// 建立一个服务器Socket(ServerSocket)指定端口并开始监听
			serverSocket = new ServerSocket(8800);
 
			// 监听一直进行中
			while (true) {
				// 使用accept()方法等待客户发起通信
				Socket socket = serverSocket.accept();
				new SocketThread(socket).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
import java.net.*;
import java.io.*;
 
public class SocketThread extends Thread {

	/*
	 * 	(1)创建服务器端线程类,run()方法中实现对一个请求的响应处理。
	 * 	(2)让服务器端Socket一直处于监听状态。
	 * 	(3)服务器端每监听到一个请求,创建一个线程对象并启动
	 */

	Socket socket = null;
	//每启动一个线程,连接对应的Socket
	public LoginThread(Socket socket) {
		this.socket = socket;
	}
	
	//启动线程,即响应客户请求
	public void run() {
		InputStream is = null;
		ObjectInputStream ois = null;
		OutputStream os = null;
		try {
			//打开输入流
			is = socket.getInputStream();
			//反序列化
			ois = new ObjectInputStream(is);
			//获取客户端信息,即从输入流读取信息,DataObject为自定义数据类
			DataObject data = (DataObject)ois.readObject();
			if(data!=null){
				System.out.println("我是服务端,客户端传送信息为:" + data.getMessage());
			}
			
			//给客户端一个响应,即向输出流中写入信息
			os = socket.getOutputStream();
			String reply = "服务端接收成功!";
			os.write(reply.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			try {
				os.close();
				ois.close();
				is.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}			
		}	
	}	
}

客户端代码:

import java.net.*;
import java.io.*;
 
public class SocketClient {
	/*
	 * 客户端通过输出流向服务器端发送请求信息
	 * 服务器侦听客户端的请求得到一个Socket对象,将这个Socket对象传递给线程类
	 * 线程类通过输入流获取客户端的请求并通过输出流向客户端发送响应信息
	 * 客户端通过输入流读取服务器发送的响应信息
	 * 
	 */
 
	public static void main(String[] args) {
		
		Socket socket = null;
		OutputStream os = null;
		ObjectOutputStream oos = null;
		InputStream is = null;
		BufferedReader br = null;
		try {
			// 建立客户端Socket连接,指定服务器的位置为本机以及端口为8800
			socket = new Socket("localhost", 8800);
			// 打开输出流
			os = socket.getOutputStream();
			// 对象序列化
			oos = new ObjectOutputStream(os);
			// 发送客户端信息,即向输出流中写入信息,DataObject为自定义数据类
			DataObject data = new DataObject("服务端你好,我是客户端");
			oos.writeObject(data);
			socket.shutdownOutput();
 
			// 接收服务器端的响应,即从输入流中读取信息
			is = socket.getInputStream();
			br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while ((reply = br.readLine()) != null) {
				System.out.println("我是客户端,服务器的响应为:" + reply);
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
				is.close();
				oos.close();
				os.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

基于UDP的socket编程

(1)基于TCP的网络通信是安全的,是双向的,如同打电话,需要先有服务端,建立双向连接后,才开始数据通信。
(2)基于UDP的套接字就是 数据报套接字。数据报是表示通信的一种报文类型,使用数据报进行通信时无须事先建立连接,只需要指明对方地址,然后将数据送出去。这样的网络通信是不安全的,所以只应用在如聊天系统、咨询系统等场合下。
(3)两端都要先构造好相应的数据包。数据报套接字发送成功之后,就相当于建立了一个虚连接,双方可以发送数据。
(4)Java中有两个可使用数据报实现通信的类,即DatagramPacket和DatagramSocket。
(5)DatagramPacket类起到数据容器的作用,DatagramSocket类用于发送或接收DatagramPacket,以此实现数据报通信。

UDP与TCP通信的区别:

TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
速度

相关类

  • java.net. DatagramPacket :数据电报包,用于封装发送的数据。
  • java.net. DatagramSocket :数据电报套接字,不维护连接状态,不产生输入/输出数据流,用于接收和发送DatagramPacket对象封装好的数据报。

开发流程

JAVA Socket编程

UDP通信的两个端点程序是平等的,没有主次之分,甚至它们的代码都可以完全是一样的。

接收端编程步骤:

  1. 实例化DatagramSocket 创建数据报套接字,绑定到指定端口;
  2. 实例化DatagramPacket 建立要接收的UDP包;
  3. 调用DatagramSocket.receive() ,接收UDP包;
  4. 处理接收到的DatagramPacket 数据包,关闭数据报套接字。

发送端编程步骤:

  1. 实例化DatagramSocket 创建数据报套接字,绑定到指定端口;
  2. 实例化DatagramPacket 建立要发送的UDP包;
  3. 调用DatagramSocket.send() ,发送UDP包;
  4. 关闭数据报套接字。

示例代码

发送方发送咨询问题,接收方回应咨询。

接收端代码:

import java.net.*;
import java.io.*;
 
public class UDPReceive {
 
	public static void main(String[] args) {
		/*
		 * 接收方实现步骤如下: 
		 * (1)创建DatagramPacket对象,准备接收封装的数据。
		 * (2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
		 * (3)利用DatagramPacket对象处理数据。
		 */
 
		DatagramSocket ds = null;
		DatagramPacket dp = null;
		DatagramPacket dp_reply = null;
		// 创建DatagramPacket对象,用来准备接收数据
		byte[] buf = new byte[1024];
		dp = new DatagramPacket(buf, 1024);
		try {
			// 创建DatagramSocket对象,接收数据
			ds = new DatagramSocket(8800);
			ds.receive(dp);
			// 显示接收到的信息
			String mess = new String(dp.getData(), 0, dp.getLength());
			System.out.println(dp.getAddress().getHostAddress() + "说:" + mess);
			
            // 给发送端返回数据,需要发送端去接受
			String reply = "接收端:你好,我在,请咨询!";
			// 创建DatagramPacket对象,封装数据
			dp_reply = new DatagramPacket(reply.getBytes(),
					reply.getBytes().length, dp.getSocketAddress());
			ds.send(dp_reply);
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			ds.close();
		}
	}
}

发送端代码:

import java.net.*;
import java.io.*;
 
public class UDPSend {
	/*
	 * 发送方实现步骤如下: 
	 * (1)获取本地主机的InetAddress对象。 
	 * (2)创建DatagramPacket对象,封装要发送的信息。
	 * (3)利用DatagramSocket对象将DatagramPacket对象数据发送出去。
	 */
 
	public static void main(String[] args) {
		DatagramSocket ds = null;
		InetAddress ia = null;
		String mess = "发送端:你好,我想咨询一个问题。";
		try {
			// 获取本地主机地址
			ia = InetAddress.getByName("localhost");
			// 创建DatagramPacket对象,封装数据
			DatagramPacket dp = new DatagramPacket(mess.getBytes(),
					mess.getBytes().length, ia, 8800);
			// 创建DatagramSocket对象,向服务器发送数据
			ds = new DatagramSocket();
			ds.send(dp);
            
            //接受返回来的数据。
			byte[] buf = new byte[1024];
			DatagramPacket dpre = new DatagramPacket(buf, buf.length);
			ds.receive(dpre);
			// 显示接收到的信息
			String reply = new String(dpre.getData(), 0, dpre.getLength());
			System.out.println(dpre.getAddress().getHostAddress() + "说:"
					+ reply);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			ds.close();
		}
	}
}

参考文章

Java网络编程——Socket 编程
Java---Socket编程UDP/TCP-CSDN博客
JAVA进阶——Socket编程-CSDN博客
Java Socket实现简单的Http服务器文章来源地址https://www.toymoban.com/news/detail-468709.html

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

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

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

相关文章

  • SOCKET编程实现Client/ Server程序:比特洪流协议模拟

      一、引言 使用基本的套接字编程技术,以一对基本的TCP协议通信程序为基础,模拟比特洪流(BitTorrent)的分散传输技术完成一个文件的正确传输,使用标准C语言编程。本实验的目的并不是做一个实用的网络程序,而是更好地理解套接字编程原理和P2P技术,重点在特定条件

    2024年02月04日
    浏览(42)
  • 【Java】--网络编程:基于TCP协议的网络通信

    TCP协议(Transmission Control Protocol),即传输控制协议,是一种 面向连接 的, 可靠 的,基于 字节流 的传输层通信协议。数据大小无限制。 建立连接的过程需要 三次握手 。 断开连接的过程需要 四次挥手 。 使用TCP协议的通信双方分别为 客户端 和 服务器端 。 客户端负责向服务

    2024年01月23日
    浏览(58)
  • Python中两种网络编程方式:Socket和HTTP协议

    本文分享自华为云社区《Python网络编程实践从Socket到HTTP协议的探索与实现》,作者:柠檬味拥抱。 在当今互联网时代,网络编程是程序员不可或缺的一项技能。Python作为一种高级编程语言,提供了丰富的网络编程库,使得开发者能够轻松地实现各种网络应用。本文将介绍P

    2024年04月16日
    浏览(41)
  • Python中的网络编程Socket与HTTP协议的实践【第158篇—网络编程】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代,网络编程是程序员不可或缺的一项技能。Python作为一种高级编程语言,提供了丰富的网络编程库,使得开发者能够轻松地

    2024年04月09日
    浏览(85)
  • 【C语言实现windows环境下Socket编程TCP/IP协议】

    代码是别人的,问题是我的。顺便记录一下遇见的各种问题和我的解决办法。 可能的解决方案: 1、服务端和客户端不在一个局域网,可以开热点,这样就在了。然后ipconfig查看IP地址,就ok了。至于怎么查看在不在就ping一下对方就好了。 2、一个局域网下也ping不通:看看自己

    2024年02月04日
    浏览(46)
  • 基于 Socket 接口实现自定义协议通信

    访问【WRITE-BUG数字空间】_[内附完整源码和文档] 根据自定义的协议规范,使用 Socket 编程接口编写基本的网络应用软件。 掌握 C 语言形式的 Socket 编程接口用法,能够正确发送和接收网络数据包 开发一个客户端,实现人机交互界面和与服务器的通信 开发一个服务端,实现并

    2024年02月06日
    浏览(40)
  • Python多人聊天室-基于socket UDP协议

    使用Python编写的基于socket UDP通信的多功能即时聊天室,包含Tkinter编写的图形化聊天界面,功能包括有账号注册和登录,登录成功后可以查看在线用户,并和聊天室内的其他在线用户聊天,包含私聊和群发,能发送文字、表情包,以及文件等。 登录和注册 显示在线用户 群聊

    2024年02月11日
    浏览(54)
  • Java Socket 编程详解

    Java Socket 编程是指使用 Java 语言进行网络通信的过程,包括建立连接、传输数据和关闭连接等操作。Java 提供了 java.net.Socket 和 java.net.ServerSocket 两个类来支持 Socket 编程。 1.1 Socket 概述 Socket 指的是“插座”,是应用层与传输层之间的桥梁,用于在网络上进行双向通信。在 S

    2024年02月03日
    浏览(30)
  • JAVA Socket编程

    Socket编程是在TCP/IP、UDP协议上的网络编程,在此之前,先了解下常见的网络模型: OSI七层模型与TCP模型 : OSI七层模型详解 (OSI七层模型详解) Socket就在应用程序的传输层和应用层之间的一个抽象层: 在计算机网络编程技术中,两个进程或者说两台计算机可以通过一个网络

    2024年02月07日
    浏览(19)
  • JAVA—socket编程

    socket编程,是在不同的进程间进行网络通讯的一种编程技术,在socket编程中基于TCP、UDP等协议做的一层封装,是一套系统所提供的的用于进行网络通信的编程接口。 客户端java代码:  服务端java代码: 先启动服务端server,再启动客户端client,等待提示连接成功后就可以测试发

    2024年02月11日
    浏览(21)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包