【Java高级特性】Socket

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

1 Socket概述

(1)在计算机网络编程技术中,两个进程或者说两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(Socket)

(2)Socket是网络驱动层提供给应用程序的一个接口或者说一种机制。

(3)使用物流送快递的例子来说明Socket:

        -->发件人将有收货人地址信息的货物送到快递站,发件人不用关心物流是如何进行的,货物被送到收货人所在地区的快递站点,进行配送,收货人等待收货就可以了。

        -->这个过程很形象地说明了信息在网络中传递的过程。其中,货物就是数据信息,2个快递站点就是2个端点Socket。

2 java.net包

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

(2)java.net包中常用的类有SocketServerSocketDatagramPacketDatagramSocketInetAddress、URL、URLConnection和URLEncoder等。

(2)为了监听客户端的连接请求,可以使用ServerSocket类。

(3)Socket类实现用于网络上进程间通信的套接字。

(4)DatagramSocket类使用UDP协议实现客户端和服务器套接字

(5)DatagramPacket类使用DatagramSocket类的对象封装设置和收到的数据报。

(6)InetAddress类表示Internet地址。

(7)在创建数据报报文和Socket对象时,可以使用InetAddress类。

3 基于TCP协议的Socket编程

3.1 Socket类和ServerSocket类

(1)java.net包的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务器端,它们是基于TCP协议进行工作的,工作过程如同打电话的过程,只有双方都接通了,才能开始通话。

(2)进行网络通信时,Socket需要借助数据流来完成数据的传递工作

(3)一个应用程序要通过网络向另一个应用程序发送数据,只要简单地创建Socket,然后将数据写入到与该Socket关联的输出流即可。对应的,接收方的应用程序创建Socket,从相关联的输入流读取数据即可。

(4)注意:2个端点在基于TCP协议的Socket编程中,经常一个作为客户端,一个作为服务器端,也就是遵循client-server模型。

3.1.1 Socket类

Socket对象在客户端和服务器之间建立连接。可用Socket类的构造方法创建套接字,并将此套接字连接至指定的主机和端口

1)构造方法

主机名和端口号作为参数来创建一个Socket对象。创建对象时可能抛出UnknownHostException或IOException异常,必须捕获它们。

Socket s = new Socket(hostName,port);

InetAddress对象和端口号作为参数来创建一个Socket对象。构造方法可能抛出IOException或UnknownHostException异常,必须捕获并处理它们。

Socket s = new Socket(address,port);

2)常用方法

InetAddress getInetAddress();      返回与Socket对象关联的InetAddress对象

int getPort();                                   返回此Socket对象的远程端口

int getLocalPort();                           返回此Socket对象的本地端口

InputStream getInputStream();       返回与此Socket对象相关联的输入流

OutputStream getOutputStream();  返回与此Socket对象相关联的输出流

void  close();                                     关闭Socket

3.1.2 ServerSocket类

ServerSocket对象用于等待客户端建立连接,连接建立后进行通信。

1)构造方法

ServerSocket ss = new ServerSocket(port);以端口号作为参数,此端口号和Socket对象的端口号相对应。

ServerSocket ss = new ServerSocket(port,maxqu);以端口号和最大队列长度最为参数,队列长度表示系统在拒绝连接前可以拥有的客户端连接数。

2)常用方法

Socket accept();用于等待客户端发起通信,返回值是Socket对象。起到监听的作用,一旦监听到,则与客户端建立连接进行数据传输。

3.2 使用Socket编程实现登录

3.2.1 实现单客户端通信

Socket网络编程一般分为以下4个步骤:

(1)建立连接。

(2)打开Socket关联的输入/输出流。

(3)从数据流中写入信息和读取信息。

(4)关闭所有的数据流和Socket。

客户端:

1)建立连接,连接指定服务器及端口;

2)打开与Socket对象关联的输出流;

3)向输出流中写入数据;

4)打开与Socket对象关联的输入流;

5) 读取指定服务器的响应信息;

6)关闭所有数据流和Socket。

服务器端:

1)建立连接;

2)使用accept()方法监听等待客户端发起通信;

3)打开Socket关联的输入流;

4)读取客户端发来的数据;

5)打开Socket关联的输出流;

6)向输出流中写入响应信息;

7)关闭所有数据流、Socket和ServerSocket;

3.2.2 实现多客户端通信

一个服务器通常情况下都是面向很多的客户端同时提供服务,采用多线程的方式即可实现这一需求。在服务器端只做两件事:负责监听,负责响应。

客户端的实现步骤不变。

服务器端的实现步骤:

1)创建服务器线程类,run()方法中实现对一个客户端的请求的响应处理;

2)创建服务器类,修改服务器端代码,让服务器端一直处于监听状态;

3)服务器端每监听到一个请求,创建一个线程对象并启动;

部分代码参考: 文章来源地址https://www.toymoban.com/news/detail-608958.html

//多个客户端向服务器发送信息,可以使用多线程,此时,服务器只需要负责侦听,侦听到哪个客户端,就执行哪个客户端线程
//这个客户端线程里需要写服务器端接收信息和发送响应信息的代码
public class ServerThread extends Thread {
	Socket socket = null;// 初始化socket
	// ServerThread线程的有参构造方法需要传递一个Socket类型的参数

	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	// run()方法里写服务器端的响应
	@Override
	public void run() {
		InputStream is = null;
		ObjectInputStream ois = null;
		OutputStream os = null;
		try {
			// 打开输入流
			is = socket.getInputStream();
			// 反序列化
			ois = new ObjectInputStream(is);
			// 读取用户信息
			Object object = ois.readObject();
			User user = (User) object;
			System.out.println("用户名:" + user.getUserName() + ",密码:"
					+ user.getPassword());
			// 向客户端发送响应信息
			os = socket.getOutputStream();
			String str = "欢迎你,登陆成功";
			byte[] bytes = str.getBytes();
			os.write(bytes);
		} 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();
			}
		}

	}
}
//服务器端只需要负责侦听客户端
	public static void main(String[] args) {
		ServerSocket serverSocket=null;
		try {
			//创建ServerSocket对象
			 serverSocket=new ServerSocket(9000);
			 //服务器一直侦听
			while(true){
				Socket socket=serverSocket.accept();
				ServerThread st=new ServerThread(socket);
				st.start();//侦听到客户端就启动线程
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

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

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

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

相关文章

  • Educoder/头歌JAVA——JAVA高级特性:IO流

    目录 第1关:什么是IO流 相关知识 什么是字节 什么是字符 什么是IO流 第2关:字节流-输入输出 相关知识 输入流 输出流 最佳实践 编程要求  第3关:字符流 - 输入输出 相关知识 Writer Reader 编程要求  第4关:复制文件 相关知识 read()方法 write()方法 使用字节流读写文件 扩展

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

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

    2024年02月17日
    浏览(79)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(65)
  • Java 网络编程 —— 创建多线程服务器

    一个典型的单线程服务器示例如下: 服务端接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后接收下一个客户连接,假如同时有多个客户连接请求这些客户就必须排队等候。如果长时间让客户等待,就会使网站失去信誉,从而降低访问量。 一般用并发性

    2024年02月02日
    浏览(48)
  • 网络socket服务器开发几种并发模型详解

    目录 一、socket创建流程。 二、I/O多路复用 三、服务器开发常见的并发模型 1、模型一:单线程——无IO复用 1.1 模型分析 2、模型二:单线程accept + 多线程读写业务(无IO复用) 模型分析 3、模型三:单线程多路IO复用 模型分析  4、模型四:单线程多路IO复用 + 多线程业务工作

    2024年02月11日
    浏览(38)
  • 深入理解Java虚拟机:JVM高级特性与最佳实践

    Java虚拟机 Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心,是执行Java二进制代码的虚拟计算机。 JVM本身是一个进程,负责解析Java程序并将其转换为特定平台可以执行的指令集。 通过JVM,Java程序可以实现“一次编写,到处运行”的特性,使Java具有很强的平台无关特性。

    2024年02月07日
    浏览(54)
  • Java 网络编程 —— 创建非阻塞的 HTTP 服务器

    HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序。HTTP 客户程序和 HTTP 服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。HTTP 严格规定了 HTTP 请求和 HTTP 响应的数据格式,只要 HTTP 服务器

    2024年02月06日
    浏览(48)
  • Java 网络编程 —— 实现非阻塞式的服务器

    当 ServerSocketChannel 与 SockelChannel 采用默认的阻塞模式时,为了同时处理多个客户的连接,必须使用多线程 在非阻塞模式下, EchoServer 只需要启动一个主线程,就能同时处理三件事: 接收客户的连接 接收客户发送的数据 向客户发回响应数据 EchoServer 委托 Selector 来负责监控接

    2024年02月05日
    浏览(55)
  • Linux网络编程:Socket服务器和客户端实现双方通信

    目录 一,什么是网络编程 二,为什么使用端口号 三,TCP协议与UDP协议 ①TCP(传输控制协议) ②UDP(用户数据报协议,User Data Protocol) ③总结归纳 四,Socket服务器和客户端的开发流程 五,服务器和客户端相关API说明 ①socket()函数 ②bind()函数 ③listen()函数 ④accept()函数 ⑤客户端

    2024年02月11日
    浏览(71)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(89)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包