JAVA之Socket编程初步学习

Socket 简介与 Java Socket 编程示例 基本概念:Socket可以被视为网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点。它是应用程序通过网络协议进行通信的接口,上联应用进程,下联网络协议栈。物理与逻辑层面:在物理层面上,Socket可能并不真实存在,它更多的是一个逻辑上的概念。但在网络编程中,Socket是不可或缺的组成部分。Socket是网络通信中的核心组件之一,它提供了应用层进程之间进行数据交换的机制。通过Socket,不同主机上的应用进程可以建立连接并传输数据。 阅读详情

         在Java中,有三种套接字类:java.net.Socket、java.net.ServerSocket和DatagramSocket。其中Socket和ServerSocket类建立在TCP协议基础上,DatagramSocket类建立在UDP协议基础上。

       传输层向应用层提供了套接字Socket 接口,Socket 封装了下层的数据传输细节,应用层的程序通过Socket来建立与远程主机的连接以及进行数据传输。

 

      

 

    下面例子,模拟多个用户同时连接服务器,服务器收到一个客户连接申请时,就启动一个线程进行处理。

 

服务器类ServerSocketServer.java

package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketServer {
	public static void main(String[] args)throws Exception {
		new ServerSocketServer().service();
	}
	
	private int port=8888;//监听端口
	private ServerSocket serverSocket;
	public ServerSocketServer()throws Exception{
		serverSocket=new ServerSocket(port);
		System.out.println("服务器启动了.........");
	}
	public void service(){
		while(true){
			Socket socket=null;
			//进入阻塞,等待客户端的连接
			//如果客户端申请连接,则返回一个Socket对象,该对象和客户端的Socket对象构成一条通信渠道
			try {
				socket=serverSocket.accept();
				new SocketThread(socket).start();//有一个客户申请连接,就启动一个线程进行处理(可以考虑用线程池管理)
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	static class SocketThread extends Thread{
		private Socket socket=null;
		public SocketThread(Socket socket){
			this.socket=socket;
		}
		public void run(){
			try {
				String user=socket.getInetAddress()+":"+socket.getPort();
				System.out.println("新客户到来:"+user);
				//读取客户端发送类的内容
				BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
				//向客户端发送信息
				PrintWriter writer=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
				
				while(true){
				    String content=reader.readLine();
				    if(content==null) break;
					System.out.println("客户端"+user+"对服务器说:"+content);
					//服务器向客户端发送信息
					//所以必须使用println()输出
					//如果用print输出,则content必须加\r\n(content+"\r\n"),否则客户端的readLine()会无法读取,一直阻塞
				//	writer.print(content+"\r\n");//原样发回
					writer.println(content);
					writer.flush();
					if("bye".equalsIgnoreCase(content)) 
						break;//结束通信
				}
				reader.close();
				writer.close();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				if(socket!=null)
					try {
						socket.close();
					} catch (IOException e) {
						e.printStackTrace();
					}//通信结束
			}
			
		}
	}
}


客户端类ClientSocket.java

 

package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientSocket {
	public static void main(String[] args)throws Exception {
		new ClientSocket().talk();
	}
	private String host="localhost";
	private int port=8888;
	private Socket socket;
	public ClientSocket()throws Exception{
		socket=new Socket(host,port);
	}
	private void talk(){
		try {
			//从键盘接收输入(输入是中文的话,就乱码了,估计和OS的字符集有关)
			BufferedReader readerLocal=new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
			//从服务器接收信息
			BufferedReader readerServer=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
			//向服务器发送
			PrintWriter writer=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));

			while(true){
				System.out.print("客户端往服务器发送信息:");
				String msg=readerLocal.readLine();//接收来自键盘的内容
				if(msg==null || "".equalsIgnoreCase(msg)) break;
				//服务器使用BufferedReader中的readLine()读取的
				//所以必须使用println()输出
				//如果用print输出,则msg必须加\r\n(msg+"\r\n"),否则服务器的readLine()会无法读取,一直阻塞
				//writer.print(msg+"\r\n");
				writer.println("bye".equalsIgnoreCase(msg)?msg:(msg+"好"));//加个"好"字,是为了测试socket传输中文是否正常,结论正常
				writer.flush();
				System.out.println("客户端接收到来自服务器的信息:"+readerServer.readLine());
				if("bye".equalsIgnoreCase(msg))
					break;
			}
			readerLocal.close();
			readerServer.close();
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(socket!=null){
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
				
		}
	}
}

 


1.启动服务器

2.启动客户端,发送内容a,bye

3.启动客户端,发送内容b,bye

   2,3是同时存在的

 

【Java TCP/IP Socket】Socket编程大合集 为了方便各位网友学习以及方便自己复习之用,将Java TCP/IP Socket编程系列内容按照学习顺序总结如下: 【Java TCP/IP Socket】Java TCP Socket程编程 【Java TCP/IP Socket】Java UDP Socket编程 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析 【Java TCP/IP Socket】构建和解析自定义协议消息 【Java TCP/IP Socket】基于线程池的TCP服务器 【Java TCP/IP 阅读详情

相关推荐

【Socket】Java Socket编程基础及深入讲解

 Socket是Java网络编程的基础,了解还是有好处的,   这篇文章主要讲解Socket的基础编程。Socket用在哪呢,主要用在进程间,网络间通信。本篇比较长,特别做了个目录: 一、Socket通信基本示例 二、消息通信优化 2.1 双向通信,发送消息并接受消息 2.2 使用场景 2.3 如何告知对方已发送完命令 2.3.1 通过Socket关闭 2.3.2 通过Socket关闭输出流的方式 2.3.3 通过约定符号 2.3.4 通过指定长度 三、服

slw213106的博客 952

JAVA—socket编程

socket编程,是在不同的进程间进行网络通讯的一种协议,在socket编程中基于TCP、UDP等协议做的一层封装,是一套系统所提供的的用于进行网络通信的编程接口。

皮皮治不痞痞 1万+

socket-遇到一枚假程序员

1. 一脸懵比 今天又偶然看到socket,对socket有点简单的概念,知道是网络编程、客户端与服务端通信等,但是不是太了解,就随便搜了下,几千万条记录,随便点开看了几页,socket跟网络编程也是绑定在一起的,又搜了下,介绍也是好多。 随便点开了一篇,开头介绍到 “套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它。大多数程序员都非常熟悉...

软件老王 694

Java中的Socket编程详解

Socket(套接字)是网络通信的端点,允许在两台计算机之间通过网络进行数据交换。Socket是网络编程中必不可少的一部分,它建立在TCP/IP协议上,用于管理连接、传输数据。客户端Socket:用于连接远程服务器。服务器Socket:用于侦听客户端请求并与其建立连接。Java中的Socket编程通过和Socket类可以轻松实现客户端与服务器之间的通信。在实际开发中,Socket编程通常用于构建底层网络协议的基础。通过本文的示例,你应该对Java中的Socket编程有了基本的了解。

上进!努力!!! 7536

30、JAVA进阶——Socket编程

一、Socket知识 1. Socket概述 2. Socket通信原理 3. java.net包 二、基于TCP协议的Socket编程 1.Socket类和ServerSocket类 2.使用Socket编程实现登录功能 三、基于UDP协议的Socket编程 1.DatagramPacket类和DatagramSocket类 2.使用Socket编程实现客户咨询

不迁怒,不贰过。小知识,大智慧。 2万+

深入解析Carry4的内部结构与工作原理

本文深入解析了Xilinx/AMD FPGA中的核心硬件资源Carry4的内部结构和工作原理。作为实现超前进位的关键物理电路,Carry4通过其CI、DI、S、O、CO等端口,高效处理4位算术运算的进位逻辑。文章通过端口详解、结构分析和实战计算示例,揭示了其如何加速加法、减法等运算,并探讨了其在优化FPGA设计时序与资源利用中的关键作用。

n4o5p6q7r的博客 502

Java Socket编程

Socket(套接字)是计算机网络编程中的一个核心概念,它提供了一种端到端的通信服务。具体来说,Socket是应用层与传输层之间的一个抽象层,它隐藏了复杂的网络协议细节,使得开发者可以方便地进行网络通信。在Socket编程中,开发者通常不需要关心底层的网络协议是如何工作的,只需要通过Socket API进行数据的发送和接收即可。Socket可以看作是一个通信的端点,它包含了进行网络通信所需的五种信息:通信协议、本地地址、本地端口、远程地址和远程端口。

大乐乐 3万+

人大金仓V8R3企业版License更新全攻略:从查看到重启一步到位

本文详细解析了人大金仓V8R3企业版License更新的完整运维流程,涵盖从诊断当前授权状态、获取与验证新文件、精准定位旧文件路径,到安全替换文件及服务重启验证的全过程。重点针对更新流程中常见的版本匹配、文件定位、权限与服务重启等关键环节提供了实战解决方案和避坑指南,帮助运维人员高效、平稳地完成授权续期。

redis7keeper的博客 902

Java的Socket编程

  java.net包中提供了UDP和TCP这两种常见的网络协议的支持。 Socket编程   套接字使用TCP提供了两台计算机之间的通信机制。客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个Socket对象。客户端和服务器现在可以通过对Socket对象的写入和读取来进行通信。   java.net.Socket类代表一个套接字,并且java.net.ServerSocket类为服务器程序提供了一种来监听客户端,并与它们建立连接的机制。   以下步骤在两台计算机之间使用套接

健身房 3895

微信小程序 - 解决报错 {“errcode“:41002,“errmsg“:“appid missing, rid: X“} 微信报错错误码errcode“:41002问题分析及解决教程(详细排查)

【微信小程序】报错{“errcode“:41002,“errmsg“:“appid missing, rid: 64e55770-67c1fb7e-027c5a70“}:【微信小程序】微信小程序登录请求出现appid missing提示,微信公众号{"errcode":41002,"errmsg":"appid missing"},微信 报错{“errcode“:41002,“errmsg“:“appid missing,微信小程序获取openid返回appid missing的问题,微信小程序提示Erro

🏆 前端领域优质创作者 5659

uniapp [安卓苹果App端] - 实现获取请求手机位置权限+开启定位获取经纬度/省市区地址等,检测权限手机定位是否开启并引导用户同意授权,uniApp app端调用本机开启本机定位权限及IP属地

uni-app,手机定位权限,安卓Android,苹果ios,uniapp获取本机位置权限,uni-app获取用户定位数据,uniapp APP获取用户IP属地定位,判断权限,权限被拒绝了怎么办,苹果ios系统无法开启定位,获取定位权限报错,uniapp定位获取省市区,UNI-APP如何开启手机定位功能并获取经纬度,不依赖地图第三方插件组件,打包上架后如何获取,真机运行无法获取定位,安卓和ios权限获取,判断权限检查,正式打包,详细教程,根据获取当前经纬度,再根据经纬度去定位具体省市区,自定义基座打包能成功

🏆 前端领域优质创作者 1万+

java socket编程总结

java socket编程总结说明一、TCP/IP协议模型二、获取IP相关信息InetAddressInetSocketAddressURL三、TCP编程四、UDP编程五、关于TCP与UDP 说明 更新时间:2020/12/01 17:17,更新完基本内容 java的socket编程做一个总结,主要是面向Tcp和Udp编程 注意:本文仅为记录学习轨迹,如有侵权,联系删除 一、TCP/IP协议模型 在学习socket编程之前有必要复习一下TCP/IP协议模型,模型图片如下,注意,OSI是国际定义的协议,但是现

最强菜鸟 3418

lammps教程:实例讲解npt、nvt系综的选择

对于lammps新手来说,系综的选择令人困惑,到底是应该用nvt系综还是npt系综? 我在初学lammps时就被这个问题困扰了很久。如果去问别人,可能会告诉你一个答案:根据模拟需要确定。 其实和没说一样。 到底如何确定系综,确实不是一句两句能够说清楚的,不同的体系、不同的模拟目的要选择不同的系综。 前几天遇到的一个合金的模拟案例,比较有代表性,分享出来供大家参考。 建模方法和之前介绍过的高熵合金建模方法类似,先建立单晶模型,然后使用替换原子的命令获得合金结构。 建模完成后,按照常规,先上nvt系综进行驰豫

lammps_jiayou的博客 9767

Java:Socket编程学习总结

一、网络编程中两个主要的问题         一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。         在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心

且听风吟的专栏 5615

如何从 VMware 官网下载最新版本的 VMware Workstation

如何从 VMware 官网下载 VMware Workstation

XiaoqiangClub的博客 5920

【报错】open /var/lib/docker/tmp/docker-import-863402796/bin/json: no such file or directory

然后,通过docker images可以看到镜像已经加载进来了。然后,通过docker images可以看到镜像已经加载进来了。

静谧、淡雅 6223

Java socket编程

要实现两个设备间通过 Socket 进行数据传输,通常需要创建一个服务器端和一个客户端程序。 心跳(Heartbeat) 是一种用于检测连接是否仍然有效的机制,而心跳包(Heartbeat Packet) 则是实现这种机制所发送的特殊数据包。重连机制是构建健壮网络应用的关键组件,合理的重连策略能显著提升用户体验和系统稳定性。

qq_74798973的博客 1299

C#上位机+YOLO工业视觉全实战:从ONNX部署到产线缺陷检测落地(2026年工业级实战指南)

在2026年,工业视觉落地的核心挑战不是“能不能做”,而是“能不能在产线实时跑起来C#为何成为最优解?

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 733

基于Java的Socket编程的简单学习

什么是Socket 网络由下往上分为 物理层 、数据链路层 、 网络层 、 传输层 、 会话层 、 表现层 和 应用层。IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议,主要解决如何包装数据。 socket,又称套接字,是在不同的进程间进行网络通讯的一种协议、约定或者说是规范。对于soc...

咸鱼 2554

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java语言的Socket编程

在网络编程中,Socket是一种非常重要的通信机制,它是支持TCP/IP协议的基本操作单元。Java语言作为一种面向对象的编程语言,提供了强大的Socket编程支持,使得开发网络应用程序变得更加简单和高效。本文将详细介绍Java中的Socket编程,包括Socket的工作原理、常用类及方法示例、Socket通信的实现步骤,以及在实际项目中的应用场景。

2501_91366151的博客 613

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java Socket编程实例

Java Socket编程笔记 (注:需要 Java IO相关的知识) 1.使用 TCP 连接的demo 需要用到 java.net.Socket  和 java.net.ServerSocket ,具体可以查询 API 文档 创建 Sever 类和 Client 类作为 demo Server类的实现: import java.io.*; import java.ne

link98 3105

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java创建socket编程_Java Socket编程

Socket编程一、网络基础知识(参考计算机网络)关于计算机网络部分可以参考相关博客:《TCP/IP协议栈及OSI参考模型详解》1、两台计算机间进行通讯需要以下三个条件:IP地址、协议、端口号2、TCP/IP协议:是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族、或TCP/IP协议栈TCP:Transmission Control Proto...

weixin_34364310的博客 1769

java学习中的socket编程详细介绍

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 给你学习路线:html-css-js-jq-javase-数据库-jsp-servlet-Struts2-hibernate-mybatis-spring4-sprin...

李旭的博客 1033
上一篇: JAVA定时器Timer&TimerTask剖析
下一篇: JAVA线程池Executor的简单使用
夢_殤
博客等级 码龄15年 348粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值