网络编程之 传输层的协议TCP与UDP

传输层协议:

TCP和UDP的区别:

TCP:面向连接(经历三次握手)、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。 服务端和客户端

UDP:面向非连接、传输不可靠(丢包[数据丢失])、用于传输少量数据(数据包模式)、速度快。发送端和接收端


java中TCP传输实现:

中文API解释:

类 Socket

java.lang.Object继承者 java.net.Socket
直接已知子类:
SSLSocket

public class Socketextends Object
 

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

构造方法摘要
 Socket()           通过系统默认类型的 SocketImpl 创建未连接套接字
 Socket(InetAddress address, int port)           创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
 Socket(InetAddress host, int port, boolean stream)           已过时。 Use DatagramSocket instead for UDP transport.
 Socket(InetAddress address, int port, InetAddress localAddr, int localPort)           创建一个套接字并将其连接到指定远程地址上的指定远程端口。
 Socket(Proxy proxy)           创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。
protected Socket(SocketImpl impl)           使用用户指定的 SocketImpl 创建一个未连接 Socket。
 Socket(String host, int port)           创建一个流套接字并将其连接到指定主机上的指定端口号。
 Socket(String host, int port, boolean stream)           已过时。 使用 DatagramSocket 取代 UDP 传输。
 Socket(String host, int port, InetAddress localAddr, int localPort)           创建一个套接字并将其连接到指定远程主机上的指定远程端口。

java.net 类 ServerSocket

java.lang.Object继承者 java.net.ServerSocket
直接已知子类:
SSLServerSocket

public class ServerSocketextends Object
 

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

从以下版本开始:
JDK1.0
另请参见:
SocketImpl, setSocketFactory(java.net.SocketImplFactory), ServerSocketChannel

构造方法摘要
ServerSocket()           创建非绑定服务器套接字。
ServerSocket(int port)           创建绑定到特定端口的服务器套接字。
ServerSocket(int port, int backlog)           利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(int port, int backlog, InetAddress bindAddr)           使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
代码练习:
package netCode;import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException {System.out.println("------------我是客户端---------------");//创建客户端对象连接服务器端的主机和端口,第一个参数为服务器的IP地址,第二个为占用的端口号Socket client = new Socket("localhost", 10086);//获取客户端输入流的对象//为了避免中文乱码的问题转换成UTF-8格式Scanner sc = new Scanner(client.getInputStream(),"UTF-8");while(sc.hasNext()){System.out.println(sc.nextLine().getBytes());}sc.close();client.close();}
}

package netCode;import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPServer {public static void main(String[] args) throws UnknownHostException, IOException {String data = "魏杰";System.out.println("-----------服务器端----------------");ServerSocket server = new ServerSocket(10088);System.out.println("服务器已经准备就绪");while(true){//接受连接服务器的客户端对象Socket client = server.accept();System.out.println("连接过来的客户端:"+client.getPort()+"-"+client.getLocalAddress()+"-"+client.getInetAddress());System.out.println("客户端数据:"+data);//获取服务器输出流的对象//为了避免中文乱码的问题转换成UTF-8格式PrintStream out = new PrintStream(client.getOutputStream(),false, "UTF-8");out.print(data);out.close();}}
}

注意:运行时候首先运行服务器端的,然后再运行客户端,再观察客户端控制台中输出内容。

java中UDP传输实现:

中文API解释:

java.net
类 DatagramSocket

java.lang.Object继承者 java.net.DatagramSocket
直接已知子类:
MulticastSocket

public class DatagramSocketextends Object
 

此类表示用来发送和接收数据报包的套接字。

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于:DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket。

构造方法摘要
 DatagramSocket()           构造数据报套接字并将其绑定到本地主机上任何可用的端口。
protected DatagramSocket(DatagramSocketImpl impl)           创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
 DatagramSocket(int port)           创建数据报套接字并将其绑定到本地主机上的指定端口。
 DatagramSocket(int port, InetAddress laddr)           创建数据报套接字,将其绑定到指定的本地地址。
 DatagramSocket(SocketAddress bindaddr)           创建数据报套接字,将其绑定到指定的本地套接字地址。

java.net 类 DatagramPacket

java.lang.Object继承者 java.net.DatagramPacket

public final class DatagramPacketextends Object
 

此类表示数据报包。

数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。  

构造方法摘要
DatagramPacket(byte[] buf, int length)           构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)           构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length)           构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)           构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)           构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length, SocketAddress address)           构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
代码练习:
package netCode;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 Exception {System.out.println("----------我是发送端-----------------");//发送的数据String data = "大数据开发工程师";//创建发送端对象DatagramSocket send = new DatagramSocket(10010); //发送数据DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length,InetAddress.getLocalHost(),10086);send.send(packet);send.close();}
}

package netCode;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UDPReceived {public static void main(String[] args) throws Exception {System.out.println("-----------我是接收端----------------");//创建连接对象DatagramSocket receive = new DatagramSocket(10086);//接受数据byte[] b = new byte[1024];DatagramPacket packet = new DatagramPacket(b,1024);receive.receive(packet);//获取接受的数据String 	str = new String(packet.getData(),0,packet.getLength());System.out.println(str);}
}
注意:UDP发送端和接受端不能为同一个端口号否则会报错显示端口已经被占用的异常,先运行接收端然后运行发送端可以看到控制台输出内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

n a^o7 !

题目描述 All brave and intelligent fighters, next you will step into a distinctive battleground which is full of sweet and happiness. If you want to win the battle, you must do warm-up according to my instructions, which can make you in the best state prep…

socket阻塞与非阻塞,同步与异步

转自:http://blog.csdn.net/hguisu/article/details/7453390 socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调…

网络编程之如何通过URL获取网页代码

java.net 类 URL java.lang.Objectjava.net.URL所有已实现的接口: Serializable public final class URLextends Objectimplements Serializable类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,…

数据结构实验之图论七:驴友计划

题目描述 做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短&#xff…

Windows完成端口(IOCP)

http://blog.csdn.net/piggyxp/article/details/6922277

图结构练习——最小生成树

题目描述 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。 输入 输入包含多组数据&a…

Windows 中_T和L

_T("")是一个宏,定义于tchar.h下。[1] #define _T(x) _ _T(x)   #ifdef _UNICODE #define _ _T(x) L ## x #else /* ndef _UNICODE */ #define _ _T(x) x 他的作用是让你的程序支持Unicode编码 因为Windows使用两种字符集ANSI和UN…

多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的线程唤醒该线程. notify:执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待. notif…

数据结构实验之图论六:村村通公路

题目描述 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村…

技术人生“白天求生存,晚上谋发展”

白天求生存,晚上谋发展 这句话最近在团队经常有人说,其实我也深有体会,因为我看到的技术牛人他们背后肯定有一段很长时间的艰苦时光,可能是3年,也可能是8年,也可能一直还在坚持。 其实我们周围大部份人有一…

CRT

当C Runtime函数库于20世纪70年代产生出来时,PC的内存容量还很小,多任务是个新奇观念,更别提什么多线程了。因此以当时产品为基础所演化的C Runtime函数库在多线程(multithreaded)的表现上有严重问题,无法被多线程程序…

java多线程笔记补充之线程的生命周期

多线程通信的时候很容易造成死锁,死锁无法解决,只能避免: 当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁. 避免死锁法则: 当多个线程都要访问共享的资源A,B,C时,保证每一个线程都按照…

图结构练习——BFSDFS——判断可达性

题目描述 在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫。在他们所在的地域,有n个隘口,编号为1..n,某些隘口之间是有通道连接的。其中近卫军团在1号隘口,天灾军团在n号隘口。某一天&…

关于跨dll的模板单例问题

C的模板可以帮助我们编写适合不同类型的模板类&#xff0c;给代码的复用性提供了极大的方便。近来写了一个涉及单例的C模板类&#xff0c;简化下来可以归结为以下的代码&#xff1a; 1234567891011template <typename T>class Singleton{public:// 此处省去了多线程安全锁…

java多线程笔记补充之 线程控制操作

线程休眠:让执行的线程暂停一段时间&#xff0c;进入计时等待状态。 方法:staticvoid sleep(long millis) 调用sleep后&#xff0c;当前线程放弃CPU,在指定时间段之内&#xff0c;sleep所在线程不会获得执行的机会。 此状态下的线程不会释放同步锁/同步监听器. 该方法更多的用…

图结构练习——BFS——从起始点到目标点的最短步数

题目描述 在古老的魔兽传说中&#xff0c;有两个军团&#xff0c;一个叫天灾&#xff0c;一个叫近卫。在他们所在的地域&#xff0c;有n个隘口&#xff0c;编号为1..n&#xff0c;某些隘口之间是有通道连接的。其中近卫军团在1号隘口&#xff0c;天灾军团在n号隘口。某一天&…

C++中的Dll内存问题

这两天在做一个数据结构&#xff0c;使用树结构&#xff0c;两层&#xff0c;第一层的数据元素为第二层的n个分支 遇到问题如下&#xff1a; 1&#xff1a;使用vector在debug下运行正常&#xff0c;在release下源码运行正常封装后运行失败 请教了多人&#xff0c;觉得可能是vec…

Catch That Cow

题目描述 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John ha…

java5新特性静态引用、foreach、自动装箱和泛型枚举以及可变参数的总结

静态引用 导入(import)表示去找哪一个类&#xff0c;去哪一个包下去找哪些被使用到的类。 在java中有一个语言核心包&#xff1a;java.lang. 使用java.lang包中的API&#xff0c;不需要引用&#xff0c;直接能找到&#xff0c;但是&#xff0c;如果我们使用到的API不呼吁java.l…