当前位置:首页 » 编程语言 » udpsocketjava

udpsocketjava

发布时间: 2024-05-09 13:25:59

Ⅰ 什么是java socket

事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。

网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端,基于这个简单的模型,就可以进入网络编程啦。

Java对这个模型的支持有很多种Api,而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你,ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client
=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

上面的方法基本可以建立一条连线让两台计算机相互交流了,可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的,除非远程调用,处理问题的核心在执行上,否则数据的交互还是依赖于IO操作的,所以你也必须导入java.io这个包.java的IO操作也不复杂,它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。

在网络搜索里输入java socket会有N多的结果给你答案。

Ⅱ 疯狂Java讲义:使用DatagramSocket发送、接收数据[2]

程序客户端代码也与此类似 客户端采用循环不断地读取用户键盘输入 每当读到用户输入内容后就将该内容封装成DatagramPacket数据报 再将该数据报发送出去 接着把DatagramSocket中的数据读入接收用的DatagramPacket中(实际上是读入该DatagramPacket所封装的字节数组中) 客户端代码如下

程序清单 codes/ / /UdpClient java

public class UdpClient

{

//定义发送数据报的目的地

public static final int DEST_PORT = ;

public static final String DEST_IP = ;

//定义每个数据报的最大大小为 K

private static final int DATA_LEN = ;

//定义该客户端使用的DatagramSocket

private DatagramSocket socket = null;

//定义接收网络数据的字节数组

byte[] inBuff = new byte[DATA_LEN];

//以指定字节数组创建准备接受数据的DatagramPacket对象

private DatagramPacket inPacket =

new DatagramPacket(inBuff inBuff length)

//定义一个用于发送的DatagramPacket对象

private DatagramPacket outPacket = null;

public void init()throws IOException

{

try

{

//创建一个客户端DatagramSocket 使用随机端口

socket = new DatagramSocket()

//初始化发送用的DatagramSocket 它包含一个长度为 的字节数组

outPacket = new DatagramPacket(new byte[ ]

InetAddress getByName(DEST_IP) DEST_PORT)

//创建键盘输入流

Scanner scan = new Scanner(System in)

//不断读取键盘输入

while(scan hasNextLine())

{

//将键盘输入的一行字符串转换字节数组

byte[] buff = scan nextLine() getBytes()

//设置发送用的DatagramPacket里的字节数据

outPacket setData(buff)

//发送数据报

socket send(outPacket)

//读取Socket中的数据 读到的数据放在inPacket所封装的字节数组里

socket receive(inPacket)

System out println(new String(inBuff

inPacket getLength()))

}

}

//使用finally块保证关闭资源

finally

{

if (socket != null)

{

socket close()

}

}

}

public static void main(String[] args)

throws IOException

{

new UdpClient() init()

}

}

上面程序的粗体字代码同样也是通过DatagramSocket发送 接收DatagramPacket的关键代码 这些代码与服务器的代码基本相似 而客户端与服务器端的唯一区别在于 服务器所在IP地址 端口是固定的 所以客户端可以直接将该数据报发送给服务器 而服务器则需要根据接收到的数据报来决定将 反馈 数据报的目的地

读者可能会发现 使用DatagramSocket进行网络通信时 服务器端无须 也无法保存每个客户端的状态 客户端把数据报发送到服务器后 完全有可能立即退出 但不管客户端是否退出 服务器无法知道客户端的状态

当使用UDP协议时 如果想让一个客户端发送的聊天信息可被转发到其他所有客户端则比较困难 可以考虑在服务器使用Set来保存所有客户端信息 每当接收到一个客户端的数据报之后 程序检查该数据报的源SocketAddress是否在Set集合中 如果不在就将该SocketAddress添加到该Set集合中 但这样一来又涉及一个问题 可能有些客户端发送一个数据报之后永久性地退出了程序 但服务器端还将该客户端的SocketAddress保存在Set集合中……总之 这种方式需要处理的问题比较多 编程比较烦琐 幸好Java为UDP协议提供了MulticastSocket类 通过该类可以轻松实现多点广播

返回目录 疯狂Java讲义

编辑推荐

Java程序性能优化 让你的Java程序更快 更稳定

新手学Java 编程

Java程序设计培训视频教程

lishixin/Article/program/Java/hx/201311/27260

Ⅲ JAVA问题 UDP协议中的端口问题

在Java中操纵UDP

使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。

在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io. Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:

getLocalhost():返回封装本地地址的实例。

getAllByName(String host):返回封装Host地址的InetAddress实例数组。

getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。

DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:

DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。

DatagramSocket(int port):创建实例,并固定监听Port端口的报文。

DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:

Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。

Send(DatagramPacket d):发送报文d到目的地。

SetSoTimeout(int timeout):设置超时时间,单位为毫秒。

Close():关闭DatagramSocket。在应用程序退出的? 焙颍?ǔ;嶂鞫?头抛试矗?乇誗ocket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。

DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。

DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。

Ⅳ java中如何检测本机指定的UDP服务端口是否被占用并且自动分配一个可用udp端口;

1.端口占用编译器会报错,可以从错误看出来是不是端口被占用。没有专门的检测工具和方法
2.DatagramSocket(在Java中使用UDP协议编程的相关类)
用于接收和发送UDP的Socket实例。该类有3个构造函数:
DatagramSocket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口。
DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
DatagramSocket具有的主要方法如下:
1)receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

2)send(DatagramPacket dp):发送报文dp到目的地。

3)setSoTimeout(int timeout):设置超时时间,单位为毫秒。

4)close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
希望对您有帮助谢谢

Ⅳ java开发聊天功能用什么技术比较好


开发聊天功能可以采用以下几种技术:

  • Socket编程:使用Java Socket编程可以实现基于TCP或UDP的网络通信,这亏毕是Java最基础、最底层的网络编程技术。使用Socket编程可以实现实时通信、消息推送等功能,但需要自己实现消息协议、数据传输等细节。

  • Java NIO:Java NIO(New IO)是Java 1.4之后引入的一种新IO API,它提供了基于事件驱动的异步IO操作,可以大大提高网络通信效率。使用Java NIO可以实现高并发、高性能的网络通信,但需要掌握NIO的相关概念和使用方式。

  • WebSockets:WebSockets是HTML5标准中新增的一种协议,可以实现基于浏览器的实时双向通信。使用Java开发WebSockets可以实现跨平台、跨浏览器的聊天功能,但需要掌握WebSocket协议的相关概念和使用方式。

  • 第三方库:Java中有许多第三方库可以用于实现聊天功能,如Netty、Apache MINA、Smack等。这些库提供了更加简销悉芹单、易用的API,可以快速陆升搭建聊天功能,但需要熟悉相关库的使用方法和特性。

  • 具体选用哪种技术,需要根据具体需求、开发经验和技术水平等因素进行综合考虑。

热点内容
麦芒5脚本 发布:2024-11-27 21:45:33 浏览:848
dnf龙猫脚本 发布:2024-11-27 21:45:15 浏览:959
macoutlook存储位置设置 发布:2024-11-27 21:35:15 浏览:810
多台电脑共用一个多口服务器 发布:2024-11-27 21:27:45 浏览:863
算法设计与分析基础课后答案 发布:2024-11-27 21:21:53 浏览:647
linux修改mysql数据库编码 发布:2024-11-27 21:16:48 浏览:626
android10驱动 发布:2024-11-27 21:11:36 浏览:348
伤感网站源码 发布:2024-11-27 21:11:28 浏览:539
android软键盘挡 发布:2024-11-27 21:09:10 浏览:518
冒险家选哪个配置性价比高 发布:2024-11-27 20:58:36 浏览:877