JAVA网络编程

java网络编程 通信双方地址IP端口号一定的规则(即:网络通信协议。有两套参考模型)OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。 阅读详情

1、TCP程序的实现

2、将多线程应用在网络开发之中

3、UDP的程序实现


网络编程的基本概念:

网络:就是将物理上不在一起的主机进行互联。

在网络上的通讯需要使用协议,常见的通讯协议:TCP、UDP

* TCP:属于可靠的连接,使用三方握手的方式完成连接的确认。

* UDP:属于不可靠的连接

对于网络程序的开发有两种架构:

* C/S:客户端服务器端,对于这种程序需要开发两套代码,一套是客户端,另一套是服务器,维护也要两套。

* B/S:浏览器/服务器,就类似于论坛,开发和维护的时候只需要一套代码即可。


TCP程序的实现

在JAVA中,所有的网络开发包保存在java.net包中,在此包中可以使用ServerSocket、Socket类完成服务器和客户端的开发。

1、简单的Tcp程序

如果想要开发TCP程序,则首先开发服务器端,要使用ServerSocket进行客户端的连接接收,每一个客户端在程序上都使用Socket对象表示。

package wangluo;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
	public static void main(String args[]) throws IOException{
		ServerSocket serverSocket = new ServerSocket(8888);//在8888端口上开启服务
		Socket socket = serverSocket.accept();//接收客户端连接
		OutputStream outputStream = socket.getOutputStream();//得到客户端的输出流
		String code = "hello  world";//要发送的内容
		PrintStream printStream = new PrintStream(outputStream);
		printStream.print(code);
		printStream.close();
		outputStream.close();
		socket.close();
		serverSocket.close();
		
	}
}
如果此时要想进行连接的操作实验,则可以通过telnet命令完成。

那么此时就完成了一个服务器程序的开发,此程序执行完一次之后将关闭。那么现在的程序是通过telnet命令完成的服务器的访问,也可以通过单独的客户端程序编写代码进行访问。

package wangluo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ClientDemo {
	public static void main(String args[]) throws Exception{
		//表示连接的主机及端口
		Socket socket = new Socket("localhost", 8888);
		BufferedReader bufferedReader = null;
		InputStream inputStream = socket.getInputStream();
		bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
		//接收回应的内容
		String getStr = bufferedReader.readLine();
		System.out.println(getStr);
		bufferedReader.close();
		inputStream.close();
		socket.close();
	}
}


Echo 程序(回应程序)

下面通过ServerSocket和Socket类完成一个简单的echo程序,echo表示回应程序,输入的内容发送到服务器端之后,在前面加上“ECHO”的字符串再返回。

对于服务器端而言,客户端的输出是服务端的输入流,服务器端的输出流是客户端的输入流。

package wangluo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
	public static void main(String args[]) throws IOException{
		ServerSocket serverSocket = new ServerSocket(8888);
		Socket socket = null;
		boolean flag = true;
		while(flag){
			System.out.println("等待客户端响应");
			socket = serverSocket.accept();
			InputStream inputStream = socket.getInputStream();
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			OutputStream outputStream =socket.getOutputStream();
			PrintStream printStream = new PrintStream(outputStream);
			boolean temp= true;
			while(temp){
				String clientSendStr = bufferedReader.readLine();
				if(null==clientSendStr||"".equals(clientSendStr)){
					printStream.print("........");
					temp = false;
					break;
				}else if("bye".equals(clientSendStr)){
					printStream.print("bye");
					temp = false;
					break;
				}else{
					printStream.print("ECHO "+clientSendStr+"\r\n");
				}
				
			}
			
			printStream.close();
			bufferedReader.close();
			inputStream.close();
			outputStream.close();
			socket.close();
		} 
		serverSocket.close();
	}
}
那么,此时客户端的操作也应该是一样的,应该准备好输入流,而且现在的代码中存在了输入操作,所以要使用键盘输入信息。

package wangluo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class EchoClient {
	public static void main(String args[]) throws UnknownHostException, IOException{
		Socket socket = new Socket("localhost", 8888);
		
			BufferedReader bufferedReaderIN = new BufferedReader(new InputStreamReader(System.in));
			OutputStream outputStream = socket.getOutputStream();
			PrintStream printStream= new PrintStream(outputStream);
			InputStream inputStream = socket.getInputStream();
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			boolean tag = true;
			while(tag){
				System.out.println("请输入要放松的内容");
				printStream.println(bufferedReaderIN.readLine());
				String str = bufferedReader.readLine();
				System.out.println("得到的内容是:"+str);
				System.out.println("————————————————————————————————————————————————");
			}
			socket.close();
			bufferedReader.close();
			inputStream.close();
			outputStream.close();
	}
}


但是,以上的程序只适合一个线程的使用,如果有多个用户,则肯定无法同时连接,这就是传统的单线程的操作,如果想实现多线程,则每一个客户端应该使用线程表示出来。

加入多线程

每一个客户端都使用一个线程进行表示。

package wangluo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoThreadServer {
	private static boolean IS_OPEN_SERVER = true;// 服务器是否是开启的

	public static void main(String args[]) throws IOException {
		ServerSocket serverSocket = new ServerSocket(8888);
		while (IS_OPEN_SERVER) {
			new Thread(new ThreadServer(serverSocket.accept())).start();
		}
		serverSocket.close();
	}
}

class ThreadServer implements Runnable {
	private Socket socket;

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

	public void run() {
		try {
			//接收数据
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(socket.getInputStream()));
			PrintStream printStream = new PrintStream(socket.getOutputStream());
			boolean IS_END = true;
			while(IS_END){
				String getCommand = bufferedReader.readLine();
				if(null==getCommand||"".equals(getCommand.trim())){
					printStream.println("客户端关闭");
					IS_END = false;
					break;
				}else if("bye".equals(getCommand)){
					printStream.println("客户端关闭");
					IS_END = false;
					break;
				}else{
					printStream.println("传递数据成功啦"+getCommand);
				}
			}
			printStream.close();
			bufferedReader.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

一个服务器应该实现多线程。


UDP程序实现


UDP程序使用数据的形式出现,需要使用以下两个类:

* 数据报的内容: DatagramPacket

* 发送和接收数据报: DatagramSocket

在开发TCP程序的时候,是先要有服务器端,之后再进行客户端的开发,而UDP要运行的时候则应该先运行客户端,之后再运行服务器端


客户端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceive {
	public static void main(String[] args) throws IOException {
		//客户端在3000端口等待服务器发来的信息
		DatagramSocket socket = new DatagramSocket(3000);
		//开辟1024空间
		DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
		socket.receive(datagramPacket);
		System.out.println("接收到的内容是: "+new String(datagramPacket.getData()));
	}

}


服务器端:

package wangluo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPSend {
	public static void main(String[] args) throws IOException {
		//服务器端在9000端口等待接收服务器发来的信息
		DatagramSocket datagramSocket = new DatagramSocket(9000);
		String sendStr = "hello world";
		DatagramPacket datagramPacket = 
				new DatagramPacket(sendStr.getBytes(), 0, sendStr.length(), InetAddress.getLocalHost(),3000);
		datagramSocket.send(datagramPacket);
	}

}



总结:

1、TCP程序的开发依靠   ServerSocket、Socket

2、UDP程序的开发依靠   DatagramSocket 、DatagramPacket



JAVA 网络编程 文章目录1. 网络编程2.计算机网络基础知识2.1 计算机网络:2.2 网络通讯的要素2.3 IP地址2.3.1 IP地址的分配2.3.2 IP地址的分类3. 端 口4. 常用默认端口5.网络通信协议/接口6. OSI的七层模型7. TCP协议8. IP协议(Internet Protocol/因特网互联协议)是网络上的计算机进行连接的基础9. TCP/IP协议9.1 InetAddressSoc... 阅读详情

相关推荐

游戏开发实战:5种AOI算法对比(九宫格 vs 灯塔 vs 十字链表)

本文深入对比了游戏开发中五种主流AOI算法(九宫格、灯塔、十字链表等)的性能与适用场景,帮助开发者根据项目规模选择最优解决方案。通过详细的技术分析和实战数据,揭示不同算法在万人同屏等极端场景下的表现差异,为MMORPG等大型多人在线游戏提供关键性能优化指南。

weixin_29268385的博客 474

【Java网络编程详解】

Java网络编程是开发分布式应用程序的重要技能,它通过套接字(Socket)进行数据传输,支持TCP和UDP协议。本文将介绍Java网络编程的基础知识,包括Socket、ServerSocket、TCP通信、UDP通信、常用类和示例代码。网络编程是指在计算机之间通过网络进行数据传输和通信的编程方式。Java提供了强大的java.net包,封装了底层的网络协议,简化了网络编程。:面向连接,可靠传输,保证数据按序到达,适合文件传输、Web通信等。:面向无连接,不可靠但速度快,适合视频通话、广播消息等。

武帝为此的博客 958

UniDexGrasp++算法实战:无需预生成姿态的灵巧抓取测试指南

本文详细解析了UniDexGrasp++算法在灵巧抓取测试中的实战应用,该算法无需预生成姿态即可实现高效抓取,特别适合处理形状不规则的物体。文章涵盖了环境配置、数据集优化、训练流程及实际测试中的调参技巧,帮助开发者快速掌握这一ICCV 2023提出的先进算法。

weixin_29045585的博客 279

Java网络编程

Java网络编程 1、网络编程 1.1、概述 1、计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统。网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。 2、Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序。 3、Java提供的网络类库,可以实现无痛的网络连

laizhenghua的博客 1万+

保姆级教程:用CANoe手把手复现ECU刷写全流程(含BootLoader三阶段详解)

本文提供了一份详细的CANoe ECU刷写实战指南,涵盖BootLoader三阶段的深度解析。从实验环境搭建到预编程、主编程及后编程阶段,逐步讲解ECU刷写的关键步骤和隐藏逻辑,特别强调UDS诊断和CAN通信的精确控制,帮助开发者掌握ECU刷写的核心技术。

weixin_29234423的博客 529

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1339

Java语言的网络编程

Java网络编程是一个庞大而复杂的领域,从基本的Socket编程到高级的HTTP处理,Java提供了丰富的工具和类库供开发者使用。了解并掌握Java网络编程,可以帮助开发者构建可靠、高效的网络应用。随着技术的不断发展,网络编程的方法和工具也在不断进步,开发者应保持学习的热情与敏锐的观察力,跟上时代的步伐。希望通过本文的讲解,能帮助您对Java网络编程有更深的理解和认识。无论是构建简单的客户端-服务器模型,还是开发复杂的Web应用,Java都能提供强大的支持。

xiaocaibao777的博客 1218

STM32F103C8T6实战指南:从零搭建最小系统与GPIO控制

本文详细介绍了STM32F103C8T6微控制器的实战应用,从零开始讲解如何搭建最小系统并进行GPIO控制。内容涵盖电源电路设计、时钟配置、GPIO工作模式详解及实战项目开发,帮助初学者快速掌握这款ARM Cortex-M3内核微控制器的核心开发技能,适用于物联网设备和嵌入式系统开发。

lemon的博客 631

Java基础之Java网络编程详解

网络编程是现代软件开发中不可或缺的一部分,它通过网络实现了计算机之间的通信,使得信息交换和数据共享成为可能。在网络通信的实现过程中,语言的选择和工具的使用至关重要,而Java提供了强大的支持,使得开发者可以更便捷地构建网络应用程序。网络通信的核心是数据的发送与接收,而Java的网络编程模型为此提供了一套易用且高效的工具。无论是点对点的通信,还是基于更复杂协议的多节点交互,Java都能满足需求。在网络编程中,基础的通信模式是基于Socket的点对点连接,它可以实现客户端和服务器之间的直接通信。

道可道非常道 2065

机器人控制算法九之 位姿描述与空间变换

机器人控制算法九之 位姿描述与空间变换

yohnyang的博客 1031

基于YOLOv5/v8/v10的答题卡填涂识别与评分系统(附数据集+UI界面+完整代码)

在教育信息化的大背景下,传统的手工阅卷方式正在被智能化技术所取代。答题卡识别作为标准化考试的核心环节,其准确率和效率至关重要。本文将详细介绍如何利用YOLO系列目标检测算法(YOLOv5、YOLOv8、YOLOv10)构建一个答题卡填涂识别与评分系统。文章从数据集的制作与标注开始,逐步深入到模型的训练、评估与对比,最后基于PyQt5设计了一个用户友好的桌面端UI界面,实现了从图像输入到得分输出的全流程自动化。

YOLO 634

Java—— 网络编程

什么是网络编程 常见软件架构 网络编程三要素:IP:InetAddress。端口号。协议:UDP协议,TCP协议

zjy_ccccc的博客 1254

14、脑肿瘤复发预测与转移瘤跟踪的自动化方法

本文介绍两种脑肿瘤相关自动化方法:一种用于预测胶质瘤切除术后的肿瘤复发位置,结合图像配准、静态模型和动态模拟模型,利用患者的DTI数据进行预测;另一种用于在纵向扫描中跟踪转移性脑肿瘤,通过联合求解配准参数估计和图像变化标记问题,提高肿瘤跟踪的准确性和效率。文章同时分析了两种方法的优势与挑战,并提出了未来研究方向,旨在为脑肿瘤的诊断和治疗提供更可靠的工具。

defi6farmer的博客 115

【Java 基础】Java 网络编程

Java的网络编程是指使用Java语言进行网络通信的编程技术。在Java中,可以使用Socket和ServerSocket类来实现基于TCP协议的网络通信,也可以使用DatagramSocket和DatagramPacket类来实现基于UDP协议的网络通信。

激流丶的博客 1890

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32F407中文手册

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

十二、Java网络编程

文章目录十二、Java网络编程1.网络编程入门1.1 网络编程概述【理解】1.2 网络编程三要素【理解】1.3 IP地址【理解】1.4InetAddress【应用】1.5端口和协议【理解】2.UDP通信程序2.1 UDP发送数据【应用】2.2UDP接收数据【应用】2.3UDP通信程序练习【应用】3.TCP通信程序3.1TCP发送数据【应用】3.2TCP接收数据【应用】3.3TCP通信程序练习【应用】3.4TCP通信程序练习【应用】3.5TCP通信程序练习【应用】3.6TCP通信程序练习【应用】3.7TCP通

汪随安的博客 2917

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

12 java网络编程

网络编程章节,主要是把IO流的知识使用在网络上,用于网络传输。 网络传输其实也是一种IO流的方式。

qq_34106499的博客 415

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java 之网络编程

本文详细讲解了 Java 网络编程的基础知识和实战代码,包括 TCP 和 UDP 的区别、网络编程的三要素以及使用 Socket 和 DatagramPacket 类实现网络通信。希望这些内容能够帮助各位看官深入了解 Java 网络编程。

weixin_64178283的博客 1834

Java 网络编程

Java通过java.net和java.nio包提供网络编程支持,支持TCP和UDP协议。TCP使用Socket实现可靠连接通信,包含ServerSocket(服务端)和Socket(客户端);UDP通过DatagramSocket实现无连接通信。示例代码展示了基本的TCP/UDP服务端与客户端实现流程,包括建立连接、数据收发等关键步骤。此外,Java还提供HttpURLConnection类专门处理HTTP协议通信,可方便地发起HTTP请求。这些API为开发网络应用提

weixin_73916358的博客 564
上一篇: 对象序列化
下一篇: JDBC(未完 别看呢)
跳跳
博客等级 码龄15年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值