- 浏览: 27441 次
文章分类
转:http://waynerqiu.com/1/85.html
JAVA中TCP/UDP编程实例
开发时用127.0.0.1测试,关于127.0.0.1我就不多说了
首先我们必须了解我们能用的端口地址只能在0~65535之间
其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口.
我一般用8000以上,网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议.
JAVA中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 , waynerQiu.com!"; 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)); OutputStream ops = s.getOutputStream(); ops.write("hello,World!".getBytes()); System.out.println(br.readLine()); br.close(); ops.close(); s.close(); ss.close() } }
再次使用telnet工具可以看到,这次可以发送不止一个字符了,按回车键后发送数据到服务器端.
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)); OutputStream ops = s.getOutputStream(); ops.write("hello,World!".getBytes()); System.out.println(br.readLine()); br.close(); ops.close(); s.close(); ss.close() } }
再次使用telnet工具可以看到,这次可以发送不止一个字符了,按回车键后发送数据到服务器端.
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工具来查看已经被使用的端口
相关推荐
在IT行业中,网络编程是不可或缺的一部分,特别是在Java开发中,TCP和UDP协议是网络通信的基础。本实验项目“tcp_udp_socket.zip”旨在帮助开发者理解如何使用Java实现TCP和UDP的Socket通信。以下将详细讲解这两个...
下面我们将详细探讨TCP和UDP的特点、Java中的Socket编程以及如何进行连接测试。 TCP是一种面向连接的、可靠的传输协议,它确保了数据的完整性和顺序性。在TCP通信中,数据在发送前会建立连接,并且在接收方会按照...
9. **UDP编程**:除了TCP,Java还支持UDP(用户数据报协议)编程,通过DatagramSocket类实现。UDP是无连接的,不保证数据的顺序和可靠性,但具有更高的传输速度。 10. **SSL/TLS安全通信**:对于涉及敏感信息的网络...
在Android开发中,TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的网络通信协议,它们各自具有不同的特点和应用场景。本篇将详细讲解Android环境下如何使用TCP和UDP进行通信,并介绍一个名为`TCPUtil`的...
本实例源码集专注于Java实现的TCP/IP网络编程,适合初学者和有经验的开发者加深理解。下面将详细介绍其中涉及的关键知识点。 一、TCP/IP基础知识 TCP/IP协议族包括四个主要层次:应用层、传输层、网络层和数据链路...
Socket编程在IT领域中是网络通信的基础,尤其在TCP/IP协议栈中扮演着至关重要的角色。TCP/IP(Transmission Control Protocol/Internet Protocol)是一组通信协议,用于规定互联网上设备之间的数据传输方式。在这个...
第8章:介绍了TCP程序设计流程、基于C/C++的TCP程序设计实例和基于Java技术的TCP程序设计实例。 第9章:介绍了UDP程序设计流程、基于C/C++的UDP程序设计实例和基于Java技术的UDP程序设计实例。 第10章:介绍了使用...
Java网络编程是Java开发中的重要领域,它涵盖了网络应用...提供的《Java网络编程实例》将可能包含这些概念的具体代码示例,帮助读者更好地理解和掌握相关技术。阅读和分析这些实例,是提升Java网络编程技能的有效途径。
Java基于TCP通信是网络编程中的一个关键部分,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,我们通常使用`java.net.Socket`和`java.net.ServerSocket`类来实现TCP通信。...
1. **DatagramSocket类**:这是Java中用于UDP通信的主要类,它代表一个UDP套接字,可以用来发送和接收数据报。创建DatagramSocket实例后,可以调用其send()方法发送数据,使用receive()方法接收数据。 2. **...
实现TCP/IP客户端服务端通讯,开发者需要了解基本的网络编程概念,如socket编程接口、TCP/IP协议的工作原理以及数据在网络中的传输过程。在实际编程中,还要注意异常处理,确保程序的健壮性。 7. **应用场景**: ...
浅谈java的TCP和UDP编程 Java 编程中,TCP 和 UDP 是两种常用的网络协议,在网络编程中占据着非常重要的地位。今天,我们将深入浅谈 Java 中的 TCP 和 UDP 编程。 TCP 编程 TCP(Transmission Control Protocol)...
在IT行业中,网络通信是至关重要的一个领域,Java作为一门广泛应用的编程语言,提供了丰富的API来支持TCP(传输控制协议)和UDP(用户数据报协议)这两种不同的网络通信方式。本篇文章将深入探讨如何使用Java实现TCP...
本资料包"欧姆龙以太网通讯TCP_UDP例子及欧姆龙PLC程序例子说明.zip"提供了关于如何实现欧姆龙PLC与外部设备通过TCP/IP和UDP/IP进行通信的实例和详细说明,对于理解欧姆龙PLC的网络通信功能极具价值。 首先,TCP...
Java TCP线程聊天是一种基于Java网络编程实现的多人实时通信方式。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,我们通常使用`java.net.Socket`和`java...
在本示例中,我们聚焦于一个基于MFC(Microsoft Foundation Classes)的TCP/IP Socket编程实践。 MFC是微软提供的一套C++库,用于简化Windows应用程序开发。它为开发者提供了面向对象的接口,可以便捷地访问Windows...
以上只是Java TCP/IP Socket编程的一些基本概念和关键点,实际应用中还会涉及到更多高级话题,如SSL/TLS安全套接层、多播Socket、UDP(用户数据报协议)编程等。通过深入学习和实践,你可以掌握构建高效、稳定的网络...
在Java中,TCP客户端和服务器端通过Socket类的实例来建立连接和数据交换。 UDP套接字基于用户数据报协议(UDP),它是一种无连接的协议,适用于对实时性和效率要求较高的场景,但不保证数据的可靠性和顺序。在Java...
在Java编程语言中,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的网络通信协议,用于在互联网上实现数据的可靠传输。本文将深入探讨这两种协议的基本概念,以及如何使用纯Java来实现TCP和UDP的示例代码。...
本文将深入探讨TCP/IP协议及其在Java编程中的应用。 TCP/IP协议栈是一个四层模型,包括应用层、传输层、网络层和数据链路层。TCP位于传输层,主要负责端到端的数据传输,确保数据的完整性和顺序,以及在网络中建立...