1. 使用java网络编程编写SIP消息的收发,TCP和UDP有什么区别
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
UDP
UDP 与 TCP 的主要区别在于 UDP 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。ICQ 短消息使用 UDP 协议发送消息。
许多程序将使用单独的TCP连接和单独的UDP连接。重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。
TCP
TCP的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TCP在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径发送,即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似,只是级别更高而已。
为确保正确地接收数据,TCP要求在目标计算机成功收到数据时发回一个确认(即 ACK)。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要时丢弃它。
TCP与UDP的选择
如果比较UDP包和TCP包的结构,很明显UDP包不具备TCP包复杂的可靠性与控制机制。与TCP协议相同,UDP的源端口数和目的端口数也都支持一台主机上的多个应用。一个16位的UDP包包含了一个字节长的头部和数据的长度,校验码域使其可以进行整体校验。(许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。)
很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择。当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如:DNS交换。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料的性能低下,但是我们相信在不远的将来,TCP可靠的点对点连接将会用于绝大多数的网络应用。
2. 基于 Socket 的 UDP 和 TCP 编程介绍
TCP和UDP是网络体系结构中传输层的两种不同通信协议。TCP(传输控制协议)是一种面向连接的协议,提供可靠的全双工字节流服务,确保数据在传输过程中顺序无误,不重复,适用于需要稳定数据传输的场景。UDP(用户数据报协议)是一种无连接协议,处理的细节比TCP少,不能保证消息传送到目的地,也不保证数据包的顺序,适用于对实时性要求高,但数据丢失风险可接受的场景。
TCP的优缺点如下:
- 优点:提供显式连接创建和终止,确保数据顺序无误,不重复,处理流控制,允许数据优先级,未送达数据会返回错误状态,处理大数据块时自动分割。
- 缺点:创建和维护连接增加了开销,与UDP相比速度较慢。
UDP的优缺点如下:
- 优点:不要求建立连接,无因接收方认可收到数据包的开销,适用于短应用和控制消息,网络带宽需求更小。
- 缺点:不保证消息传送到目的地,不保证数据包顺序。
Socket接口是TCP/IP网络的API,用于开发TCP/IP网络应用程序。Socket接口允许程序员创建、绑定、监听、连接、发送和接收数据,以及关闭连接。常见的Socket类型包括流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM),分别用于面向连接的TCP服务和无连接的UDP服务。
Socket编程示例包括服务器端和客户端流程。服务器端首先创建Socket,绑定到本地地址和端口,然后监听连接请求,接受客户端连接,处理数据交换,并关闭连接。客户端则创建Socket,请求连接服务器,发送数据,并接收服务器返回的数据,最后关闭连接。
UDP/IP应用编程接口(API)允许用户创建Socket,绑定到服务器地址和端口,接收数据,发送数据,以及关闭连接。UDP编程示例包括服务器接收数据和返回数据,客户端发送数据并接收服务器返回的数据。
调试部分包含Makefile文件,用于编译和管理源代码,实现自动编译和清理生成文件的功能。运行Makefile可以编译源代码,执行make clean命令删除生成的文件。
以上内容介绍了TCP和UDP协议的基本概念、优缺点、Socket编程实现以及调试过程,适用于对网络通信协议和Socket编程有深入理解的需求。
3. 做网络通信 JAVA开发的,主要要学习说明内容
1.IP地址与端口号
网络中的计算机若需要实现相互通信,必须为每台计算机指定标识号,通过标识号来指定接收数据和识别发送数据的计算机。TCP/IP协议中的“标识”即为IP地址。
一台计算机可同时运行多个网络程序,使用IP地址能够将数据发送到计算机,却不能保证将数据提交至哪个网络程序。因此每个被发送的网络数据包的头部都设有“端口”部分,该部分为整数,用于表示将数据帧交给哪个应用程序进行处理。同时还必须为网络程序指定端口号,使不同的应用程序接收不同端口上的数据。
同一台计算机不能存在多个使用同一端口的程序。端口数的范围在0-65535之间,其中在0-1023之间的端口号用于知名的网络服务和应用,1024以上的端口号用于普通应用程序,这样做可以避免端口号代表的网络程序串用。
2.TCP与UDP
TCP为传输控制协议,UDP为用户数据报协议。TCP是面向连接的通信协议,它提供两台计算机之间可靠无差错的数据传输。应用程序使用TCP进行通信时,数据源与目标之间将建立虚拟的连接,连接一旦建立,两台计算机之间就可以将数据作为双向字节流进行交换。
UDP是无连接的通信协议,它不保证可靠数据的传输,但能够实现向若干个目标发送数据的功能。
3.Socket简介
Socket(套接字)是网络驱动层为应用程序提供的接口和机制,其作用可以看作是为应用程序创建的港口码头。
4.TCP网络编程概述
TCP协议具体操作步骤如下:
(1)服务器程序创建ServerSocket对象,调用accept()方法等待客户端连接。
(2)客户端程序创建Socket对象与客户端建立专线连接。
(3)服务器接收客户的连接请求,并创建新的Socket对象与客户端建立专线连接。
(4)实现(2)、(3)步骤中建立连接的两个Socket在同一线程上对话。
(5)服务器重新等待新的连接请求。
5.ServerSocket类
TCP网络服务器程序的编写,需要使用ServerSocket类创建服务器。
ServerSocket类的主要方法如下:
方法 类型 描述
public ServerSocket(int port) 构造方法 创建ServerSocket实例
public Socket accept() 方法 等待客户端连接
public InetAddress getInetAddress() 方法 返回服务器的IP地址
public boolean isClosed() 方法 返回ServerSocket的关闭状态
public void close() 方法 关闭ServerSocket
服务器端每次运行时均需调用accept()方法等待客户端连接,该方法执行后服务端将进入阻塞状态,直到客户端再次连接。accept()方法的返回类型为Socket。
6.Socket类
客户端必须创建Socket对象来建立与服务器的连接,每个Socket对象代表一个客户端。
Socket类的常用方法如下:
方法 类型 描述
public Socket(String host,int port) 构造方法 创建Socket对象,同时指定要连接服务器的主机名和商品号
public InputStream getInputStream() 方法 返回套接字的输入流
public OutputStream getOutputStream() 方法 返回套接字的输出流
public boolean isClosed() 方法 返回套接字的关闭状态
public void close() 方法 关闭此Socket
注意:TCP网络编程中的信息使用输入输出流的形式传递。
7.TCP服务器程序
编写TCP服务器程序,代码如下:
package com;
import java.net.*;
import java.io.*;
public class TcpServer{
public static void main(String []a){
ServerSocket server=null;
Socket socket=null;
BufferedReader in=null;
PrintWriter out=null;
try{
//服务器在9000端口上监听
server=new ServerSocket(9000);
//接收客户端连接
socket=server.accept();
//得到客户端输入信息
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向客户端输出信息,true是自动刷新缓冲区
out=new PrintWriter(socket.getOutputStream(),true);
out.println("已建立与服务器的连接");
String info=in.readLine();
System.out.println("客户端的输入是:"+info);
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
in.close();
out.close();
socket.close();
server.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
为验证服务器端程序能否正常工作,程序还需提供客户端程序与服务器进行通信。Windows系统中的telnet程序是一个系统自带的TCP客户端,可以使用telnet来进行与服务器端的通信测试。运行telnet时指定连接服务器的IP地址和端口号,连接一旦建立,telnet程序窗口就可以将输入内容发送至服务器,同时,可以显示从服务器接收到的数据。测试步骤如下:
(1) 运行服务器端程序
(2) 在DOS窗口中运行telnet 127.0.0.1 9000,由于服务器端程序和客户端程序在同一台机器上,所以可以使用127.0.0.1代表本机。
注:调用一次accept()方法只能接受一个连接,接受多个连接需要将该方法放在循环语句中,同时每个连接的数据的数据输入输出也应放在一个循环语句中,才能实现服务器端与客户端的持续交换。
class Service implements Runnable{
Socket socket=null;
BufferedReader in=null;
PrintWriter out=null;
public Service(Socket socket){
this.socket=socket;
}
public void run(){
//得到客户端输入信息
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向客户端输出信息,true是自动刷新缓冲区
out=new PrintWriter(socket.getOutputStream(),true);
//循环读取客户端数据并向客户端写入数据
while(true){
out.println("已建立与服务器的连接");
System.out.println("客户端说:"+in.readLine());
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
in.close();
out.close();
socket.close();
server.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public class TcpServer{
ServerSocket server=null;
Socket socket=null;
try{
//服务器在9000端口上监听
server=new ServerSocket(9000);
//接收多个客户端连接
while(true){
socket=server.accept();
new Thread(new Service(socket)).start();
}catch(Exception e){
e.printStackTrace();
}
}
}
8.TCP客户端程序
package com;
import java.net.*;
import java.io.*;
public class TcpClient{
public static void main(String []a){
ServerSocket server=null;
Socket socket=null;
BufferedReader in=null;
BufferedReader input=null;
PrintWriter out=null;
try{
socket=new Socket("127.0.0.1",9000);
while(true){
input=new BufferedReader(new InputStreamReader(System.in);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
//向服务器端输出信息,true是自动刷新缓冲区
out=new PrintWriter(socket.getOutputStream(),true);
out.println("客户端说:"+input.readLine);
String info=in.readLine();
System.out.println("服务器说:"+info);
}catch(Exception e){
e.printStackTrace();
}
}
}
9.UDP网络编程
(1)DatagramSocket类主要用于实现信息的发送和接收。
DatagramSocket类的主要方法:
方法 类型 描述
public DatagramSocket() 构造方法 构造DatagramSocket对象不指定监听端口
public DatagramSocket(int port) 构造方法 构造DatagramSocket对象指定监听端口
public void send(DatagramPacket p) 方法 发送数据报
public void receive(DatagramPacket p) 方法 接收数据报
(2)DatagramPacket类
DatagramPacket类用于包装一条要发送或接收的信息,发送数据和接收数据都需要构建DatagramPacket对象。
DatagramPacket类的主要方法:
方法 类型 描述
public DatagramPacket(byte[] buf,in length) 构造方法 构造DatagramPacket对象时指定内存空间和大小
public DatagramPacket(byte[] buf,in length,InetAddress address,int port) 同上
public byte[] getData() 方法 返回接收数据
public int getLength() 方法 返回发送或接收数据的长度
public InetAddress getAddress() 方法 返回机器的地址
(3)InetAddress类
InetAddress类用于表示计算机地址,主要方法如下:
方法 类型 描述
public static InetAddress getByName(String host) 方法 通过主机名或IP地址获得一个InetAddress对象
public String getHostName() 方法 获得IP地址对应的主机名
public String getHostAddress() 方法 返回IP地址字符串
10. UDP程序设计
编写UDP网络程序需要分别编写发送程序和接收程序
(1)发送程序
package com;
import java.net.*;
public class UdpSend{
public static void main(String [] a){
DatagramSocket ds=null;
DatagramPacket dp=null;
byte[] buf=new byte[1024];
try{
//DatagramSocket类用于完成消息的发送
ds=new DatagramSocket();
String info="hello world";
dp=new DatagramPacket(info.getBytes(),info.length,InetAddress.getByName("localhost"),3000);
//发送数据包
ds.send(dp);
}catch(Exception e){
e.printStackTrace();
}
finally
{
ds.close(); //消息发送完毕,关闭对象
}
}
}
(2)接收程序
package com;
import java.net.*;
public class UdpRecv{
public static void main(String [] a){
DatagramSocket ds=null;
DatagramPacket dp=null;
byte[] buf=new byte[1024];
try{
//DatagramSocket类用于完成消息的发送
ds=new DatagramSocket();
dp=new DatagramPacket(buf,1024);
//接收发送方发送的数据
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength());
str=str+" from "+dp.getAddress.getHostAddress();
System.out.println(str);
}catch(Exception e){
e.printStackTrace();
}
finally
{
ds.close(); //消息发送完毕,关闭对象
}
}
}
4. TCP/IP协议和UDP的区别
TCP和IP是两个协议
TCP和UDP协议原理类似,都是往目的地发送数据包
但有一个区别是,UDP只管发,不管你收没收到,TCP会确认你收到了一个包后再发下一个
5. 网络编程用什么语言写的,就是像tcpudp协议都是用什么写出来的
每一种编程语言都有socketAPI,所以每种语言都能用于网络编程。高并发的Server是用C写的。UDPTCP是四层协议,和编程语言并没有关系,但协议结构都是以C为蓝本设计的,所以用C的struct就可以很方便的组装报文。二进制协议用C开发是最方便的。
网络编程通常是指能编写能跨越网络的应用,由于网站开发也属于网络编程,故目前大部分语言都可进行网络编程。而你所说的UDP、TCP协议,只是一种规定,并不是具体实现,协议本身是规定你要做什么样的规格,是一种规范,而网络编程语言就按这种规范去执行,是具体的实现。
tcp/IP协议是互联网的基础,有了该协议互联网才有蓬勃的发展。tcp/ip协议出现比较早,该协议族的所有协议包括udp/tcp协议都是c语言写的。关于网络编程一般是指最底层的网络socket编程,现在业务层的网络编程都是使用已经封装底层socket的库,这些库屏蔽了底层socket编程的细节,方便开发人员使用。