java之网络编程

提到java的网络编程,大家肯定会想到TCP,UDP协议,下面对这两种协议进行相应介绍
1.TCP是一种面向连接的保证可靠传输的协议,通过TCP协议传输,得到的是一个顺序的无差错的数据流,发送方和接收方两个socket之间必须建立连接,一旦连接起来,双向均可以进行发送或接收操作
2.UDP是一种无连接的协议,每个数据包报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达时间以及内容的正确性都是不能保证的

也许你会问既然UDP是这么一个不可靠的协议,那为什么还有它的价值,原因有几个
a.可靠的传输必然是要付出代价的,对数据的校验必然占用计算机处理时间和网络带宽,因此TCP的传输效率不如UDP
b.在许多应用中没必要保证严格的传输可靠性,比如视频会议系统,只需保证连贯性就可以了,这种情况下使用UDP合理一些

下面是我通过TCP连接实现多线程之间通信的小例子
首先是客户端代码

package com.lamp.client;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatClient extends JFrame {
private static final long serialVersionUID = 1164739305605633090L;

private Socket socket = null;

private JTextField text = new JTextField();

private JTextArea textArea = new JTextArea();

private DataOutputStream dos = null;

private DataInputStream dis = null;

private boolean flag = false;

public void launchFrame() {
this.setLocation(400, 400);
this.setSize(500, 300);
this.add(textArea, BorderLayout.NORTH);
this.add(text, BorderLayout.SOUTH);
this.textArea.setEditable(false);
this.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent e) {
try {
if (dos != null)
dos.close();
if (dis != null)
dis.close();
if (socket != null)
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0);
}

});
this.text.addActionListener(new MessageSendAction());
this.setVisible(true);
connect();
}

class MessageSendAction implements ActionListener {

public void actionPerformed(ActionEvent e) {
String message = ChatClient.this.text.getText().trim();
text.setText("");
try {
dos.writeUTF(message); //从输入框中得到数据后发给服务器端
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}

}

public void connect() {
try {
socket = new Socket("127.0.0.1", 2222); //和服务器端连接
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
flag =true;
new Thread(new RecieveMessage()).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

class RecieveMessage implements Runnable { //监听服务器端发来的数据流

public void run() {
try {
while (flag) {
String message = dis.readUTF();
textArea.setText(textArea.getText() + message + "\n");
System.out.println("server message back" + message);
}

} catch (IOException e) {
e.printStackTrace();
}
}

}

public static void main(String[] args) {
new ChatClient().launchFrame();

}
}



服务器段代码


package com.lamp.server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {
private ServerSocket ss = null;

private List<Client> clients = new ArrayList<Client>();

private boolean portFlag = false;

public ChatServer() {
try {
ss = new ServerSocket(2222);
portFlag = true;
} catch (IOException e) {
e.printStackTrace();
}
}

public void begin() {
try {
while (portFlag) {
Socket socket = ss.accept();
Client client = new Client(socket); // 和客户端连接并为每个客户端分配一个线程
new Thread(client).start();
clients.add(client);
System.out.println("one client connected");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

class Client implements Runnable { // 每个客户端的连接为一个Client线程
private Socket socket = null;

private DataInputStream dis = null;

private DataOutputStream dos = null;

private boolean flag = false;

public Client(Socket socket) {
this.socket = socket;
try {
dis = new DataInputStream(this.socket.getInputStream());
dos = new DataOutputStream(this.socket.getOutputStream());
flag = true;
} catch (IOException e) {
e.printStackTrace();
}
}

public void run() {
try {
while (flag) {
String message = dis.readUTF();
if (message != null) {
for (int i = 0; i < clients.size(); i++) {
Client client = clients.get(i); // 服务器端得到客户端发来的数据并分发给每个连接的客户端
client.send(message);
}
System.out.println(message);
}
}

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (dis != null)
dis.close();
if (dos != null)
dos.close();
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

private void send(String message) {
try {
dos.writeUTF(message);
} catch (IOException e) {
clients.remove(this);
e.printStackTrace();
}
}

}

public static void main(String[] args) {
new ChatServer().begin();
}

}


以上只是一个模拟线程通信的小例子,有些异常没有得到很好的处理,不足之处请见谅

下面是模拟UDP通信的例子
接收方

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPTest2 {
public static void main(String[] args) throws Exception {
//接收消息,监听5000端口
DatagramSocket socket = new DatagramSocket(5000);
byte[] buffer = new byte[500];
DatagramPacket packet = new DatagramPacket(buffer, 500);
socket.receive(packet);
System.out.println(new String(buffer, 0, packet.getLength()));

//发送消息
String answer = "I am fine, thank you";
//通过发送过来的数据包能得到源地址和端口
DatagramPacket packet2 = new DatagramPacket(answer.getBytes(), answer
.length(), packet.getAddress(), packet.getPort());
socket.send(packet2);

socket.close();
}
}



发送方

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPTest1 {
public static void main(String[] args) throws Exception {
//发送消息,注意传输的数据不能超过64KB
DatagramSocket socket = new DatagramSocket();
String str = "How are you?";
DatagramPacket packet = new DatagramPacket(str.getBytes(),str
.length(),InetAddress.getByName("localhost"),5000);
socket.send(packet);

//接受消息
byte[] buffer = new byte[200];
DatagramPacket packet2 = new DatagramPacket(buffer,200);
socket.receive(packet2);
System.out.println(new String(buffer,0,packet2.getLength()));

socket.close();
}
}

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

相关推荐

【编号326】全国地灾数据全国25万多个地质灾害点空间分布数据

全国地质灾害点分布数据涵盖25万多个各类灾害点信息,为灾害防治提供重要依据。通过分析灾害分布规律,可识别高风险区,指导监测预警、应急避险和基础设施建设。多地成功案例(如湖北兴山崩塌避险、重庆长寿滑坡预警、湖南"挪床行动")证明,提前预警和科学防治能有效避免人员伤亡。云南省2024年通过预警体系成功避让31起灾害,保护1342人生命安全。这些实践表明,地质灾害防治需结合科技手段与群防体系,实现早预警、早处置。

千奇百怪无奇不有 1467

java 聊天_java聊天室的实现代码

本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下聊天室界面:源码:public class ClientFrame extends Frame {private TextField textFieldContent = new TextField();private TextArea textAreaContent = new TextArea();private Soc...

weixin_32271479的博客 715

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1751

java利用Socket实现聊天室功能实例

最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。 ChatClient: public class ClientFrame extends Frame {    private TextField textFieldContent = new TextField();  private...

爱诺情缘的博客 4610

对比学习(contrastive learning)

什么是自监督学习? 举个通俗的例子:即使不记得物体究竟是什么样子,我们也可以在野外识别物体。 我们通过记住高阶特征并忽略微观层面的细节来做到这一点。那么,现在的问题是,我们能否构建不关注像素级细节,只编码足以区分不同对象的高阶特征的表示学习算法?通过对比学习,研究人员正试图解决这个问题。 什么是对比学习? 对比学习是一种自监督学习方法,用于在没有标签的情况下,通过让模型学习哪些数据点相似或不同来学习数据集的一般特征。 让我们从一个简单的例子开始。想象一下,你是一个试图理解世界的新生婴儿。在家里,假设你有两只

cziun的博客 11万+

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4192

【Java网络编程详解】

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

武帝为此的博客 958

【功能安全】软件安全架构

目录01 软件安全架构介绍02 软件架构设计模板03 软件架构设计示例 软件架构设计的目的 软件架构设计的原则 软件架构设计输入与输出 软件架构设计的要求 注:软件架构设计和软件安全要求之间的双向可追溯性。软件架构设计原则: 软件架构静态/动态设计(参考秒尼科技术) 软件架构静态设计 软件架构动态设计 软件分层架构设计 软件架构设计安全机制错误探测的安全机制 其中:数据的范围检查指输入输出数据的范围进行检查,例如:在程序中我们可以通过数据范围来排除数据的正确性;合理性检查 例如:使用参

weixin_36460584的博客 511

Java网络编程

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

laizhenghua的博客 1万+

[QMT量化交易小白入门]-105、震荡市最适合的策略:ETF多标的动态网格策略,回测年化收益47.81%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 2061

dolphinscheduler集群服务一键安装启动实现流程剖析

通过以上分析我们基本梳理清楚了整个dolphinscheduler项目的一键安装启动逻辑, 我们现在在通过一张图正好理一下整个实现流程。关于一键停止集群服务及一件查询集群各个角色服务实例运行状态的实现也都在stop-all.sh/status-all.sh及dolphinscheduler-daemon.sh这三个脚本中, 有兴趣自行研究。写这篇文章的核心目的不仅在于给大家分享如何优秀的开源项目的一键安装部署的实现过程。

最爱嫣夜来 1207

Java语言的网络编程

随着互联网的迅速发展,网络编程已经成为软件开发中不可或缺的一部分。Java作为一种跨平台、面向对象的编程语言,其强大的网络编程能力使得开发网络应用程序变得更加简单和高效。在这篇文章中,我们将深入探讨Java语言的网络编程,包括其基础概念、核心API、常用框架以及实际应用案例等。

2501_90443686的博客 456

【100%通过率】华为od机试C卷【出差 / 员工派遣】C++ 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2193

Java基础之Java网络编程详解

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

道可道非常道 2064

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Java 基础】Java 网络编程

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

激流丶的博客 1889

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

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

Java 之网络编程

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

weixin_64178283的博客 1834

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java—— 网络编程

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

zjy_ccccc的博客 1253

十二、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通

汪随安的博客 2916

12 java网络编程

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

qq_34106499的博客 415

Java 网络编程

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

weixin_73916358的博客 564
上一篇: java虚拟机基础知识
下一篇: 快速排序
lk231_java
博客等级 码龄15年 0粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值