Java中的TCP/UDP网络通信编程

转自http://hi.baidu.com/annleecn/blog/item/269db81d5a5f298d87d6b6d4.html

 

127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问.

端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口.

网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议.

Socket连接套接字,Java分别为TCP和UDP提供了相应的类,TCP是java.net.ServerSocket(用于服务器端)和java.net.Socket(用于客户端);UDP是java.net.DatagramSocket.

1,Java编写UDP网络程序

1.1,DatagramSocket

DatagramSocket有如下构造方法:
1,DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。
2,DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
3,DatagramSocket(int port, InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.

如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.

发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.

发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.

1.2,DatagramPacket

DatagramPacket类有如下构造方法:
1,DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为length的数据包。
2,DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。

接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.

1.3,InetAddress

Java中对IP地址进行包装的类,

DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.

1.4,UDP程序例子

发送程序:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpSend {

public static void main(String[] args) throws Exception {
   DatagramSocket ds = new DatagramSocket();
   String str = "hello , world!";
   DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.105"),3000);
   ds.send(dp);
   ds.close(); //关闭连接
}
}

接收程序:
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpRecv {
public static void main(String[] args) throws Exception {
   DatagramSocket ds = new DatagramSocket(3000);
   byte[] buf = new byte[1024];
   DatagramPacket dp = new DatagramPacket(buf,buf.length);
   ds.receive(dp);
   String str = new String(dp.getData(),0,dp.getLength());
   System.out.println(str);
   System.out.println("IP:" + dp.getAddress().getHostAddress() + ",PORT:" + dp.getPort());
   ds.close();
}
}
测试要先运行接收程序,再运行发送程序.如果接收程序没有接收到数据,则会一直阻塞,接收到数据后才会关闭程序.如果网络上没有数据发送过来,接收程序也没有阻塞,通常都是使用了一个已经被占用的端口.

2,Java编写TCP网络程序

2.1,ServerSocket

编写TCP网络服务程序,首先要用到java.net.ServerSocket类用以创建服务器Socket.它的常用构造方法有:
1,ServerSocket(int port):创建绑定到特定端口的服务器套接字。
2,ServerSocket(int port, int backlog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。
3,ServerSocket(int port, int backlog, InetAddress bindAddr):使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

2.2,Socket

客户端要与服务器建立连接,必须先创建一个Socket对象,它的常用构造方法有:
1,Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
2,Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
3,Socket(InetAddress address, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定远程端口上的指定远程地址。
4,Socket(String host, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定远程主机上的指定远程端口。

对于通常情况的应用,使用第1个构造方法来创建客户端的Socket对象,并与服务器建立连接,是非常简单和方便的.

服务器端程序调用ServerSocket.accept方法等待客户端的连接请求,一旦accept接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象.建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket.getInputStream返回Socket的输入流对象,Socket.getOutputStream返回Socket的输出流对象.

2.3,TCP程序例子的服务器程序:

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
public static void main(String[] args) throws Exception {
   ServerSocket ss = new ServerSocket(8000);
   Socket s = ss.accept();
   InputStream ips = s.getInputStream();
   OutputStream ops = s.getOutputStream();
   ops.write("hello,World!".getBytes());
   byte[] buf = new byte[1024];
   int len = ips.read(buf);
   System.out.println(new String(buf,0,len));
   ips.close();
   ops.close();
   s.close();
   ss.close();
}
}
在这个程序里,创建了一个在8000端口上等待连接的ServerSocket对象,当接收到一个客户的连接请求后,程序从与这个客户建立了连接的Socket对象中获得输入输出流对象,通过输出流首先向客户端发送一串字符,然后通过输入流读取客户端发送过来的信息,并将这些信息打印,然后关闭所有资源.

要先运行服务器程序,然后才能运行客户端程序,当TCP服务器程序运行到Socket.accpet()方法等待客户连接时,accept方法将阻塞,一直到有客户连接请求到来,该方法才会返回,如果又没有请求到来,又没有发生阻塞,通常都是使用了一个已经被占用的端口.

我们可以使用windows提供的telnet工具在命令行窗口中测试一下服务器程序:命令如下:telnet localhost 8000

可以看到,telnet只要有输入就发送,因此我们如果想要在服务器端一次读多个字符的话,还需要进一步处理,看如下代码:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
public static void main(String[] args) throws Exception {
   ServerSocket ss = new ServerSocket(8000);
   Socket s = ss.accept();
   InputStream ips = s.getInputStream();
   BufferedReader br = new BufferedReader(new InputStreamReader(ips)); //对InputStream进行包装,增加了缓存
   OutputStream ops = s.getOutputStream();
   ops.write("hello,World!".getBytes());
   System.out.println(br.readLine());
   br.close(); //关闭包装类,会自动关闭里面的基类
   ops.close();
   s.close();
   ss.close();
}
}

再次使用telnet工具可以看到,这次可以发送不止一个字符了,按回车键后发送数据到服务器端.

2.4,TCP程序例子改进后的服务器程序:

大多数情况下,服务器端都要服务多个客户端,但一次accept方法调用只接收一个连接,因此,要把accept方法放在一个循环语句中,这样就可以接收多个连接.每个连接的数据交换代码也放在一个循环中,这样才能保证两者可以不停地交换数据.

每个连接的数据交换代码必须放在独立的线程中运行,否则,这在段代码运行期间,就没法执行其他的程序代码,accept方法也得不到调用,新的连接无法进入.

下面是一个例子,客户端向服务器发送一个字符串,服务器将这个字符串中的所有字符反向排列后回送给客户端.客户端输入"quit",退出程序.
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
public static void main(String[] args) throws Exception {
   ServerSocket ss = new ServerSocket(8000);
   while(true){
    Socket s = ss.accept();
    new Thread(new Servicer(s)).start();
   }
}
}

class Servicer implements Runnable{
Socket s;
public Servicer(Socket s){
   this.s = s;
}
public void run(){
   try{
    InputStream ips = s.getInputStream();
    OutputStream ops = s.getOutputStream();
   
    BufferedReader br = new BufferedReader(new InputStreamReader(ips));
    DataOutputStream dos = new DataOutputStream(ops);
    while(true){
     String strWord = br.readLine();
     if(strWord.equalsIgnoreCase("quit")){
      break;
     }
     String strEcho = (new StringBuffer(strWord).reverse().toString());
     dos.writeBytes(strWord + "------->" + strEcho + System.getProperty("line.separator"));
    }
    br.close();
    dos.close();
    s.close();
   }catch(Exception e){
    e.printStackTrace();
   }
}
}

2.5,TCP程序例子客户端程序:


import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient {
public static void main(String[] args) throws Exception{
   if(args.length < 2){
    System.out.println("Usage:java TcpClient ServerIP ServerPort");
    return ;
   }
   Socket s = new Socket(InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
   InputStream ips = s.getInputStream();
   OutputStream ops = s.getOutputStream();
   BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
   DataOutputStream dos = new DataOutputStream(ops);
   BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
  
   while(true){
    String strWord = brKey.readLine();
    dos.writeBytes(strWord + System.getProperty("line.separator"));
    if("quit".equalsIgnoreCase(strWord)){
     break;
    }else{
     System.out.println(brNet.readLine());
    }
   }
   dos.close();
   brNet.close();
   brKey.close();
   s.close();
}
}
先运行服务器程序,再在命令行使用java TcpClient 192.168.0.3 8000,这样就启动了客户端程序.我们可以启动多个客户端程序.

我们可以利用netstat工具来查看已经被使用的端口

MinerU在线API异步调用代码开发示例 本文展示了如何使用Python异步编程调用MinerU在线API进行文件批量上传。代码示例包含三个主要功能:1) 通过API密钥获取文件上传URL;2) 使用信号量控制并发上传多个文件;3) 获取提取结果。实现采用httpx异步客户端和asyncio库,支持文件存在性检查、错误处理和日志记录。示例中演示了如何上传PDF文件到MinerU平台,并提供了获取批量处理结果的接口。该代码可作为异步调用MinerU API的参考实现。 阅读详情

相关推荐

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

Java的网络编程(TCP/UDP)

首先,想要理解好网络编程,我们需要先理解信息在网络中是如何传递的。这便不得不提一提计算机网络结构中的五层模型。在计算机网络中,信息是通过五层模型中的不同层次进行传递的。五层模型分别为物理层、数据链路层、网络层、传输层和应用层。下面简单介绍一下信息在网络中的传递过程:物理层:物理层是网络模型中最底层的层次,负责将比特流转换成电信号或光信号,并将其发送到网络中的其他设备。物理层的主要任务是定义电气、机械、功能和规程接口,以便将数据传输到其他设备。一般都是肉眼可见的物理介质,比如双胶线、光纤、同轴电缆等等。数据链

qq_59335499的博客 705

SDRAM控制器——添加读写FIFO

用FIFO实现数据缓存

H19981118的博客 2626

Java中网络编程、TCP通信与UDP通信

目录 一、网络通讯协议 1、概述 2、IP 地址和端口号 3、InetAddress 类 二、TCP 协议与 UDP 协议 1、TCP 协议 (1) 三次握手 (2) 四次挥手 2、UDP 协议 三、TCP 通信 1、ServerSocket 类(实现服务端) 2、Socket 类(实现客户端) 3、TCP 通信实例 四、UDP 通信 1、DatagramPacket...

ONESTARの博客 3923

别再死记硬背了!用这5个Qt Design Studio小项目,彻底玩转核心组件

本文通过5个Qt Design Studio实战项目,帮助开发者深入理解核心组件的协作与应用。从动态登录界面到游戏化任务列表,每个项目都展示了组件属性与交互设计的巧妙结合,让你不再死记硬背,而是真正掌握Qt Design Studio的核心技能。

weixin_29202213的博客 271

基于Matlab的深度学习OFDM系统信号检测

在接收端,我们首先去除循环前缀,然后对接收到的信号进行FFT变换和QAM解调。在通信系统中,正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种常用的调制技术,它可以将高速数据流分成若干个低速子载波进行传输,提高了信道利用率和抗干扰性能。接下来,我们使用训练好的神经网络对QAM调制后的数据进行检测,得到估计的FFT变换结果。深度学习方法可以通过大量的训练数据来学习信号的特征,并具有一定的适应能力,在某些情况下可能能够获得更好的检测性能。

2301_79325657的博客 296

java实现UDP及TCP通信

UDP(User Datagram Protocol)用户数据报协议,TCP(Transmission Control Protocol) 传输控制协议,是传输层的两个重要协议。UDP是一种无连接、不可靠传输的协议。其将数据源IP、目的地IP和端口封装成数据包,不需要建立连接,每个数据包的大小限制在64KB内;发送不管对方是否准备好,接收方收到也不确认,故是不可靠的;可以广播发送,发送数据结束时无需释放资源,开销小,速度快。UDP协议适合于即时通信场景,例如语音通话、视频等。

Super algorithm 的博客,技术爱好者。 2951

【Qt】QtCreator远程部署、调试程序

1)QtCreator 工具–> 选项 --> 设备 --> 添加2)设备设置向导选择–> Generic Linux Device --> 开启向导3)填写“标识配置的名称”(随便写)、设备IP、用户名 --> 下一步4)选择配对秘密文件,第一次配对,可以不填写,点击“下一步”5)点击“完成”6)设备添加成功,需要再配置SSH端口号、用户名、密码等7)保存SSH登陆密码:验证类型选择默认“Default”–> “创建新密钥”–> “Test”

郭老二 5193

网络编程

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 网络编程   1. 网络编程引言    回顾单机的IO传输,如何多个PC之间数据传输?利用网络在多个PC之间数据传输。就是Socket编程。 什么是计算机网络 是指特定的物理线路,将分散,独立的计算机或者相关设备连接起来,并通过共用的

Monkyo的博客 396

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 247

ROSTEA软件下载及情感分析详细操作教程(附网盘链接)

原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。

m0_64336780的博客 1万+

java udp 绑定网卡_Java中的TCP/UDP网络通信编程

网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议.127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问.端口地址在0~65535之间,其中0~1023之间的端口是用于一些知...

weixin_29073241的博客 1004

汽车电子 静态电流

**静态电流(Static Current 或 Quiescent Current, IQ)** 是指汽车在 **熄火 / 关机 / 睡眠模式** 下,电子控制单元(ECU)或电子元件仍然保持基本功能(RTC、存储保持、Wake-up 监测、CAN/LIN 监听等)所消耗的微弱电流。

天赐好车的博客 759

java udp客户端程序_Java TCP/UDP网络通信编程

网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议.127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问.端口地址在0~65535之间,其中0~1023之间的端口是用于一些知...

weixin_42503813的博客 446

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java TCP/UDP网络通信编程

本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议. 127.0.0.1是回路地址...

weixin_30747253的博客 138

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java 网络编程详解:从基础到实战,彻底掌握 TCP/UDP、Socket、HTTP 网络通信

本文全面介绍Java网络编程技术,涵盖TCP/UDP通信、HTTP请求处理及实战应用。主要内容包括:网络编程基础概念(IP、端口、协议等);TCP可靠连接与UDP无连接通信的实现方式;Java核心网络类(Socket、URLConnection、HttpClient等)的使用方法;通过多线程聊天程序、HTTP请求和RPC调用等实战案例演示应用场景;并给出资源管理、异常处理、性能优化等最佳实践建议,帮助开发者构建高效安全的网络应用。文章既包含理论讲解,也提供丰富的代码示例,适合Java开发者系统学习网络编程技

weixin_73962764的博客 1841

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java笔记038-网络编程/网络的相关概念、InetAddress类、Socket、TCP网络通信编程、netstat指令、UDP网络通信编程、网络编程章节练习

Java笔记038-网络编程/网络的相关概念、InetAddress类、Socket、TCP网络通信编程、netstat指令、UDP网络通信编程、网络编程章节练习

qq_59621600的博客 746

Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】

一、简单的网络知识 1、网络模型: ①、OSI/RM(Open System Interconnection Reference Model开放式系统互连基本参考模型),是由ISO(International Standards Organization国际标准化组织)提出的网络参考模型。 ②、TCP/IP(Transmission Control Protocol/Intern

liuhaomatou的专栏 7772

Network——Socket网络通信机制以及实现举例(TCP、UDP等)

1. 网络通信与Socket前言 TCP/IP协议族中网络层的IP地址可以唯一标识网络中的主机,而传输层的端口可以唯一标识主机中的应用程序。Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的......

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

Java中的网络编程

Java中的网络编程 主要内容 软件架构CS/BS 网络通信三要素 TCP通信 Socket套接字 ServerSocket 一、 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p99Ap9gt-1594453760833)(img/1_cs.jpg)] B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常

qq_39594037的博客 423
上一篇: 一个超级好用的java反编译工具
xzydejava
博客等级 码龄23年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值