Java Socket网络编程

用Java实现基于Socket的网络编程 使用Java语言,采用TCP协议,实现一对一、一对多的通信(无用户界面) 阅读详情

网络编程:OSI参考模型   TCP/IP参考模型

网络通讯要素:IP地址  端口号  传输协议

IP地址:网络中设备的标识,不易记忆,可用主机名,本机回环地址127.0.0.1,主机名:localhost

端口号:用于标识进程的逻辑地址,不同进程的标识,有效端口0~65535,其中0~1024系统使用或保留端口

传输协议:通讯的规则,常见协议有TCP  UDP


InetAddress类:

//获取本机ip对象

InetAddress ip = InetAddress.getLocalHost();

//获取主机名称

System.out.println(ip.getHostName());

//获取主机地址

System.out.println(ip.getHostAddress());

//将指定的字符串主机地址获取其ip对象

InetAddress ip1 = InetAddress.getByName("192.122.1.123");

InetAddress.getByName//获取该对象的所有IP地址


UDP协议:

将数据及源和目的封装成数据包中,不需要建立连接,每个数据包的大小在限制在64K内,因无连接,是不可靠协议,不需要建立连接,速度快


TCP协议:

建立连接,形成传输数据的通道,在连接中进行大量数据传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会稍低。


Socket:就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间是通过IO传输


例1,需求:将数据通过udp协议发送出去。

步骤:

1,建立udpsocket服务。DatagramSocket 对象。

2,将数据封装成数据包。

3,通过socket服务的send方法将数据包发送出去。

4,关闭服务。

代码:

//创建udpsocket服务。

DatagramSocket ds = new DatagramSocket(8888); 

byte[] buf = "hi,ge men  坐着 UDP 来了".getBytes(); 

//将数据封装成数据包。

DatagramPacket dp =  
	new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.249"),10000);

//使用socket服务的send方法。将数据发出。

ds.send(dp);

//关闭服务。

ds.close();


例2,需求:建立udpsocket服务,监听一个10000端口,接收数据,并打印到屏幕上。

步骤:

1,建立接收端的socket服务。通常需要监听一个端口。其实就是分配了具体指定的数据标识。

2,通过服务的receive方法接收数据,并将数据存储到数据包中。

3,通过数据包对象的方法,获取具体的数据内容。

4,将数据内容打印。

5,关闭服务.

代码:

//通过该服务接收10000端口来数据。首先要建立一个数据包,用来存储接收到的数据。
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);//将数据存储到数据包中。该方法是阻塞式方法。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+"..."+text);
//关闭服务。
ds.close();


例3,一个聊天程序

import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class Chat {
	Frame f = new Frame("我的聊天室");
	// 定义一个主框架

	TextField tfIP = new TextField(15);
	// 定义一个输入文本框,指定文本框中最多显示的字符个数为15

	List lst = new List(10);
	// 定义一个图形化的列表框,表明最多显示10行,多的用滚动条显示

	DatagramSocket ds;//数据报套接字是包投递服务的发送或接收点。
	//此程序是在一台电脑上,所以可以只定义一个数据报套接字,接、收都用它


	/*
	 * 由于DatagramSocket的构造函数声明可能抛出异常,我们的程序需要用try…catch语句
	 * 进行异常捕获处理,所以不能直接在这里调用DatagramSocket的构造函数对ds进行初始化,
	 * 我们需要将ds的初始化放在Chat类的构造函数中去完成。
	 */

	public Chat() {//构造方法中生成线程,并充当数据接受端
		try {
			ds = new DatagramSocket(3000);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		//接受方应该在一个单独的线程中运行,一面在接受不到进行阻塞时
		//不影响其他程序的运行
		new Thread(new Runnable() {//用匿名内部类来实现
			public void run() {
				byte buf[] = new byte[1024];//构造存放接受内容的数据包的缓冲数组
				DatagramPacket dp = new DatagramPacket(buf, 1024);
				while (true) {
					try {
						ds.receive(dp);
				//接受网络发送过来的消息,并把接受到的消息放在dp数据包中
						lst.add(dp.getAddress().getHostAddress()+":"+dp.getPort()+
							": "+new String(buf, 0, dp.getLength()), 0);
						//用列表框的add方法把接受到的内容显示出来,第二个参数为0表示把
						//最后添加的显示在第一行这样聊天时新的内容才在最上面,不用拖动
						//滚动条来显示
						//显示时把发送方的ip地址和端口字符串形式先显示,后面显示内容
					} catch (Exception e) {
						if(!ds.isClosed()){
							e.printStackTrace();
					//我们在关闭窗口时关闭了数据报套接字,而recevie还在等待,就会有异常
						}
					}
				}
			}
		}).start();
	}

	public static void main(String[] args) {
		Chat chat = new Chat();
		chat.init();
	}

	// 初始窗口
	public void init() {
		f.setSize(302, 300);// 设置窗口宽度为300,高度为300
		f.add(lst);// 主框架中添加列表框

		Panel p = new Panel();
		p.setLayout(new BorderLayout());
		p.add("West", tfIP);// 把文本框添加到面板上的左边

		TextField tfData = new TextField(20);
		p.add("East", tfData);// 添加一个可以显示20个字符的文本框放在面板的右边
		f.add("South", p);    // 把面板添加到主框架的下方
		f.setVisible(true);   // 让主框架可视
		f.setResizable(false);// 让重设窗口大小为false,限制用户改变窗口的大小

		// 增加关闭窗口的事件处理代码
		f.addWindowListener(new WindowAdapter() {
			// 用匿名内部类的方式在主框架上添加一个事件处理器
			// 重写关闭方法,让程序退出时释放端口等资源
			public void windowClosing(WindowEvent e) {
				ds.close(); // 程序退出时,关闭Socket,释放相关资源
				f.setVisible(false);
				f.dispose();
				System.exit(0);
			}
		});

		// 下面增加在消息文本框中按下回车键的事件处理代码
		tfData.addActionListener(new ActionListener() {
			// 重写actinonPerformed方法,所在组件发生操作时调用,这里处理回车事件
			public void actionPerformed(ActionEvent e) {
				// 取出文本框中的消息字符串,并将其转换成字节数组				
				byte[] buf;
				
				//buf=tfData.getText().getBytes();
				//如果用此句,tfData变量就必须是final常量
				
				buf = e.getActionCommand().getBytes(); 
				//getActionCommand返回与此动作相关的命令字符串。
				try {
					DatagramPacket dp = new DatagramPacket(buf, buf.length,
							InetAddress.getByName(tfIP.getText()), 3000);
				// 新建数据包,通过文本框tfIP文本区域内容得到IP,并转换成为InetAddress类型
					// 设定接受端接受该数据包的端口为3000

					ds.send(dp); // 发送数据包
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				/*
				 * 上面的Exception的引用变量名不能为e,而是改写成了ex,因为e已经在
				 * actionPerformed方法中作为形式参数变量名被定义过了。
				 */
				((TextField) e.getSource()).setText("");
			}
		});
	}
}


TCP网络程序:

客户端对Socket,服务端对象ServerSocket

建立客户端和服务器端,

建立连接后,通过Socket中的IO流进行数据的传输

关闭socket


例2,需求:建立一个客户端,给服务端发送一些文字信息。 

步骤:

一,建立客户端:

1,创建客户端的socket服务,通常可以在建立客户端对象时,指定服务端的地址和端口。

如果没有指定,可以通过方法,connect进行指定目的的连接。

2,获取socket流中的输出流对象,给服务端写点数据

3,关闭资源

二,建立服务端:

1,建立服务端socket服务。ServerSocket 给服务端加上一个数字标识,分配一个端口号。

让该程序监听一个端口。

2,获取连接过来的客户端对象。使用获取到的客户端和客户端进行通信。

3,关闭客户端。

4,关闭服务端。

客户端代码:

Socket s = new Socket("192.168.1.249",10002);

//如果连接建立成功,就有了socket流。

//获取socket输出流,将数据写到服务端去。

OutputStream out = s.getOutputStream();

out.write("hi,哥们 骑着 TCP 来了".getBytes());

s.close();


服务端代码:

//建立服务端socket服务,并监听一个端口。

ServerSocket ss = new ServerSocket(10002);

//获取客户端对象。

Socket s = ss.accept();//是阻塞式方法。

InputStream in = s.getInputStream();

byte[] buf = new byte[1024];

int len = in.read(buf);

String ip = s.getInetAddress().getHostAddress();

String text = new String(buf,0,len);

System.out.println(ip+":"+text);

s.close();

ss.close();
 


Java网络编程:通过Socket读写数据 在网络编程中,文本数据是最常见的传输形式。Java通过和类处理字符流,适合传输字符串或文本消息。这些类基于Socket的输入和输出流构建,简化了文本数据的读写操作。:从输入流读取文本行,适合处理多行文本。:向输出流写入文本,支持自动刷新功能。当需要传输非文本数据(如整数、浮点数)或追求高效传输时,二进制数据是更好的选择。Java的和类支持以二进制格式读写原始数据类型和字符串,数据格式与平台无关。:读取二进制格式的原始数据类型,如readInt()。:写入二进制格式的原始数据类型,如。 阅读详情

相关推荐

Java网络编程:介绍Java提供的网络编程接口,如Socket,ServerSocket,URL等,并通过实例说明它们的用法。

一、Java网络编程简介 网络编程的重要性 Java网络编程的优点 网络编程中的基本概念和术语介绍(如IP地址、端口号、协议等) 二、Java网络编程核心组件 Socket Socket的定义和作用 创建Socket对象 使用Socket进行通信 Socket类的主要方法与属性 Socket的实例演示 ServerSocket ServerSocket的定义和作用 创建ServerSocket对象 使用ServerSocket接收客户端连接 ServerSocket类的主要方法和属性 ServerSocke

哎 你看的博客 1204

TCP、UDP网络编程

------- android培训、java培训、期待与您交流! ---------- 一、网络通信基本点 两台机器要想相互进行通讯的话,必须具备的三个基本条件: 1、找到对方的ip地址(也就是逻辑地址) 2、数据发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行了标识,为了方便称呼这个数字,叫做“端口”。这里的“端口”叫做逻辑端口,不是物理上的那种

u013470176的专栏 1703

Java网络编程:Socket与InetAddress

Java的网络编程允许开发者创建能够在互联网上通信的应用程序。java.net包是Java网络功能的核心,包含了用于TCP/IP通信的Socket类和用于地址解析的类。这些类简化了底层网络操作,使开发者能够专注于应用程序逻辑。平台无关性:Java代码可在不同操作系统上运行,无需修改。易用性:API设计直观,即使是网络编程新手也能快速上手。健壮性:内置的异常处理机制(如)有助于管理网络错误。本文将重点介绍如何使用Socket连接服务器以及使用查找和报告网络地址。Socket。

静水深流 729

Java Socket编程(一) Socket编程原理及基本概念

介绍了Socket编程的基本概念,并以UDP编程为例,给出示例。

我的天空 我的梦 2万+

告别手动输入!用Burp插件+ddddocr,5分钟搞定图片验证码自动识别

本文详细介绍了如何利用Burp插件和ddddocr开源库快速构建图片验证码自动识别系统,实现高效、零成本的验证码自动化解决方案。通过环境搭建、性能调优和Burp Suite深度集成,显著提升安全测试效率,特别适用于金融和电商系统的批量测试场景。

weixin_29099217的博客 202

海康机器人ID5000 系列智能读码器(三)

又過了兩個月,漸漸的對這個攝像頭的功能更加熟悉了,而實際上,我要做的功能也越來越複雜,從一開始的讀碼,到後來的通過讀二維碼控制設備,再到未讀到二維碼控制設備等,下面就對具體的細項做一個總結。了解完這些就能對ID5000這個設備,乃至很多海康的設備都能做一個二次開發。

qq_54359036的博客 3073

某科学的超 Java网络编程:Socket通信原理及实例学习

首先来思考几个问题: 如何把互联网上的网页抓下来?如何与互联网上的网络资源通信?如何在两个Java程序之间建立网络?面向连接与非面向连接的通信方式有什么区别? 接下来以此篇文章来学习: 理解计算机网络编程的概念,掌握如何使用Java在一台或多台计算机之间进行基于TCP/IP协议的网络通讯。通过理解TCP/IP协议的通讯模型,以JDK提供的java.net包为工具,掌握各种基

lemonGuo的大脑皮层、小脑、海马体、杏仁核..... 4766

迭代牛顿-欧拉法——机器人动力学逆解

迭代牛顿-欧拉法牛顿欧拉法的步骤向外回归(outward recursion)step 1step 2向内回归(inward recursion)step 3step 4牛顿欧拉法的三种形式无坐标系NE算法(Coordinate-Free Algorithm)连杆坐标系NE算法(Link-Coordinates Algorithm)3-D向量NE算法 牛顿欧拉法的步骤 牛顿欧拉法(NE)是求解机器人动力学逆解的一种方法。动力学逆解定义为:已知机器人的构型qqq和运动的速度q˙\dot{q}q˙​和加速度q¨

qq_41845878的博客 4097

java scoket实现ping_java socket 使用

package com.test.socket;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socke...

weixin_42356340的博客 904

高效爬取懂车帝车型数据:从静态解析到动态反爬实战

本文详细解析了如何高效爬取懂车帝车型数据,从静态HTML解析到动态接口反爬的完整实战路径。文章重点介绍了使用浏览器开发者工具定位数据、应对CSS混淆与参数加密等反爬策略,并提供了整合静态与动态抓取逻辑的Python代码示例,帮助开发者稳健地获取结构化车型信息。

wind6的博客 937

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 236

纯java 实现ping 功能

其实ping功能就是TCP到80端口,我是这样理解的,所以我们要使用java实现的话只要建立socket就行了那么几行代码就OK啦 import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channel...

moto72的专栏 232

AI颠覆市场调研:生成式智能体如何重构商业决策?

AI正在将市场调研从"成本中心"转变为"战略武器"。当企业能够用生成式智能体实时模拟百万级虚拟用户时,传统调研的样本偏差、时间滞后、成本高昂等问题将不复存在。对于开发者而言,这不仅是技术的狂欢,更是参与商业规则重构的历史机遇。行动建议立即体验Simile/Aaru的智能体平台,验证虚拟样本效果参与LLM持续性记忆架构的开源项目(如Memory Llama)关注AI调研API的标准化进程(如Hugging Face的Market Research Toolkit)

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 614

socket网络编程 java_Java socket网络编程

Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。网络基础首先看下网络的分层结构和一些基本协议:网络分层协议.jpg基于TCP/IP协议族的网络,被分为四层,分别为应用层,传输层,网际层以及网络接口层,每一层都设计了相应的协议,我们常用的一些协议(如...

weixin_39588679的博客 636

Python 爬虫实战:模拟登录网易云音乐(加密接口逆向与自动化登录实现)

网易云音乐作为国内主流的音乐流媒体平台,其丰富的音乐资源和个性化推荐算法吸引了大量用户。对于开发者而言,模拟登录网易云音乐并实现自动化操作,可以用于数据分析、歌单同步、歌词抓取等场景。然而,网易云音乐采用了多重加密机制和反爬策略,直接模拟登录存在较大挑战。

yansideyucsdn的博客 2590

2025年下半年网络工程师案例分析真题及答案解析

2025年下半年网络工程师案例分析真题及答案解析

鹿鸣天涯 1090

【Java】网络编程(Socket)

网络编程(Socket)

triticale的博客 1451

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java网络编程之Socket

一、什么是网络模型? 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Clien...

唱歌古树的博客 681

jre9下载 jdk9

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java的Socket网络编程(TCP/IP)详细教程

Socket编程通讯原理

菲菲的博客 4230

JAVA网络编程——socket套接字的介绍上(详细)

大家好!今天笔者分享一篇关于Socket 套接字的博客,希望能为正在学习网络编程的读者提供一些帮助。梳理网络通信的基础概念本文还将顺带总结一些与 Socket 密切相关的基础知识,包括:IP 地址、端口号、网络协议、五元组、协议分层模型的作用与内容、TCP/UDP 区别、Socket API 的使用方式,以及如何通过代码模拟客户端/服务器之间的通信过程。理解客户端与服务器的数据交互。

cjejwe的博客 6318

Java网络编程:socket与Netty

Socket 实现了TCP/IP协议,可以连接到网络上的上脑,并收发数据ServerSocket 用于服务端,可以监听服务端口,等待客户端连接,连接后可以生成用于传输数据的Socket创建服务端 创建客户端 客户端发送消息 服务端接收消息 也可以使用Netty很方便的实现socket编程 Netty介绍 简介 按照官方定义,它是一个异步的、基于事件 Client/Server 的网络框架,目标是提供一种简单、快速构建网络应用的方式,同时保证高吞吐量、低延时、高可靠性。 Netty 的

闫玉林的博客 7520

Java Socket网络编程-总结

本文涉及:什么是网络编程;什么是IP地址、端口号及域名;DNS详细解析过程;网络的分层结构及协议;什么是Socket;什么是TCP/IP协议;TCP协议(定义;报文头解析;三次握手;四次挥手等);UDP协议(定义;报文头解析;使用场景;案例等);TCP协议与UDP协议的区别;TCP 短连接和长连接的区别;TCP粘包、拆包及解决办法;TCP 流量控制;TCP 拥塞控制等等内容

精◈彩◈猿◈笔◈记 1171

java实现socket网络编程

1、网络编程原理: 网络编程两大步骤 一、如何定位网络上的一台或者多台主机: 网络层主要负责网路主机的定位,数据传输传输的路由,由ip地址可以唯一的确定internet上的一台主机。 二、如何在定位之后进行数据的传输; 在传输层则提供面向应用的可靠(TCP)或者非可靠(UDP)的数据传输机制 对于客户端/服务器(C/S)结构。 即通信双方一方作为服务器等待客户提出请求并予以响应。 客户则在需要服务...

未的博客 4380

Java网络编程Socket原理

Java网络编程之底层Linux的Socket网络套接字 用户态和内核态 用户态和内核态主要是基于操作系统Linux来说的。 内核态:内核态其实可以直接理解为内核,主要是控制CPU或者磁盘、网卡等硬件设备这些资源。 用户态:用户态是权利有限的程序,我们可以理解为不能直接使用CPU或者磁盘、网卡等资源的程序,我们写的大多数程序运行在用户态,比如JVM。 为什么要有用户态和内核态? 主要为了集中管理和调配资源以及保护资源和系统。毕竟CPU和内存以及IO设备这些资源任何程序都能随便调用和访问,对于这些资源本身来说

令狐二中 745

关于java网络编程socket的回顾

关于java网络编程这块,是每个入门的开发者在初学java的时候都会接触的一个知识点,在此之前的要求就是必须得弄明白java繁多的各种IO流,所以在java网络编程这一块设计到大量的流操作,原因很简单,因为网络编程所做的工作基本就是数据的交互,在数据的交互中就产生了大量的IO流的读写。 在此之前有必要过一下底层网络的一些基础知识,关于计算网络体系结构与常规协议一图概括: 目前对于常见的web开发...

youhaiguo的博客 378
上一篇: JavaScripts实例:简易计算器
下一篇: Java GUI:AWT、Swing、UI绘制、双缓冲技术
梦中的梦
博客等级 码龄18年 16粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值