Java网络编程基础TCP和UDP

1、TCP和UDP

  TCP协议:

   概念:面向连接的、可靠的、基于字节流的运输层协议。

   特点:面向连接、点到点的通信、高可靠性、占用系统资源多、效率低。

  UDP协议:

   概念:一种无连接的传输层协议,提供面向事务的简单不可靠的运输层传送服务。

   特点:非面向连接,传输不可靠、可能丢失数据;不确认接收方是否收到,只管发送;可以广播发送;非常简单的协议、开销小

2、常用类及方法

InetAddress

此类表示互联网协议 (IP) 地址。

常用方法:

//静态方法
static InetAddress getByAddress(byte[] addr):
    在给定原始 IP 地址的情况下,返回 InetAddress 对象。 
static InetAddress getByAddress(String host, byte[] addr):
    根据提供的主机名和 IP 地址创建 InetAddress 
static InetAddress getByName(String host):
    在给定主机名的情况下确定主机的 IP 地址。
static InetAddress getLocalHost() 
    返回本地主机。 

//非静态方法
byte[] getAddress():返回此 InetAddress 对象的原始 IP 地址。 
String getHostAddress():返回 IP 地址字符串(以文本表现形式)。 
String getHostName():获取此 IP 地址的主机名。 

InetSocketAddress

此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。

常用方法:

//构造方法
InetSocketAddress(InetAddress addr, int port) 
          根据 IP 地址和端口号创建套接字地址。 
InetSocketAddress(int port) 
          创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。 
InetSocketAddress(String hostname, int port) 
          根据主机名和端口号创建套接字地址。 


//静态方法
static InetSocketAddress createUnresolved(String host, int port) 
          根据主机名和端口号创建未解析的套接字地址。 

//非静态方法
InetAddress getAddress() 
          获取 InetAddress。 
String getHostName() 
          获取 hostname。 
int getPort() 
          获取端口号。 

URL

URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

常用方法:

//构造方法
URL(String spec) 
          根据 String 表示形式创建 URL 对象。 
URL(String protocol, String host, int port, String file) 
          根据指定 protocol、host、port 号和 file 创建 URL 对象。 
URL(String protocol, String host, int port, String file, URLStreamHandler handler) 
          根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象。 
URL(String protocol, String host, String file) 
          根据指定的 protocol 名称、host 名称和 file 名称创建 URL。


//常用方法
 String getFile() :获取此 URL 的文件名(包含参数、锚点)。 
 String getPath() :获取此 URL 的路径部分(不包含参数、锚点)。 
 String getHost() :获取此 URL 的主机名(如果适用)。 
 int getPort() :获取此 URL 的端口号。 
 String getProtocol() :获取此 URL 的协议名称。 
 String getQuery() :获取此 URL 的查询部分。 
 String getRef() :获取此 URL 的锚点(也称为“引用”)。 
 

ServerSocket

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

常用方法:

//构造方法
ServerSocket() :创建非绑定服务器套接字。 
ServerSocket(int port) :创建绑定到特定端口的服务器套接字。 

//常用方法
Socket accept() :侦听并接受到此套接字的连接。 
void close() :关闭此套接字。 
InetAddress getInetAddress() :返回此服务器套接字的本地地址。 
int getLocalPort() :返回此套接字在其上侦听的端口。 

Socket

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

常用方法:

//构造方法 
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(String host, int port) 
          创建一个流套接字并将其连接到指定主机上的指定端口号。 
Socket(String host, int port, InetAddress localAddr, int localPort) 
          创建一个套接字并将其连接到指定远程主机上的指定远程端口。 

//常用方法
void bind(SocketAddress bindpoint) :将套接字绑定到本地地址。 
void close() :关闭此套接字。 
void connect(SocketAddress endpoint) :将此套接字连接到服务器。 
InetAddress getInetAddress() :返回套接字连接的地址。  
InetAddress getLocalAddress() :获取套接字绑定的本地地址。 
int getLocalPort() :返回此套接字绑定到的本地端口。 
InputStream getInputStream() :返回此套接字的输入流。
OutputStream getOutputStream() :返回此套接字的输出流。 

HttpURLConnection

支持 HTTP 特定功能的 URLConnection。

常用方法

//构造方法
protected  HttpURLConnection(URL u) 

//常用方法
void setRequestMethod(String method) 
          设置 URL 请求的方法, GET POST HEAD OPTIONS PUT DELETE TRACE 以上方法之一是合法的,具体取决于协议的限制。 
void setRequestProperty(String key, String value) 
          父类URLConnection的方法,设置一般请求属性。 设置UserAgent属性可以模拟浏览器访问网站.

DatagramSocket

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

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

//常用方法
void receive(DatagramPacket p) 
          从此套接字接收数据报包。 
void send(DatagramPacket p) 
          从此套接字发送数据报包。 
void close() 
          关闭此数据报套接字。
void bind(SocketAddress addr) 
          将此 DatagramSocket 绑定到特定的地址和端口。  
void connect(InetAddress address, int port) 
          将套接字连接到此套接字的远程地址。 
void connect(SocketAddress addr) 
          将此套接字连接到远程套接字地址(IP 地址 + 端口号)。 
void disconnect() 
          断开套接字的连接。
 
 

DatagramPacket

此类表示数据报包。

//构造方法
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 的包发送到指定主机上的指定端口号。 

//常用方法
 InetAddress getAddress() 
          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 
 byte[] getData() 
          返回数据缓冲区。 
 int getLength() 
          返回将要发送或接收到的数据的长度。 
 int getPort() 
          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 
 SocketAddress getSocketAddress() 
          获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。 
 void setAddress(InetAddress iaddr) 
          设置要将此数据报发往的那台机器的 IP 地址。 
 void setData(byte[] buf) 
          为此包设置数据缓冲区。 
 void setData(byte[] buf, int offset, int length) 
          为此包设置数据缓冲区。 
 void setLength(int length) 
          为此包设置长度。 
 void setPort(int iport) 
          设置要将此数据报发往的远程主机上的端口号。 
 void setSocketAddress(SocketAddress address) 
          设置要将此数据报发往的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。 

3、UDP编程

 udp特点是只管发送,不确认对方是否收到数据。

发送数据流程如下:

a、使用DatagramSocket类创建发送端

b、准备数据

c、将数据使用DatagramPacket类打包

d、发送数据

e、关闭资源

public class UDPServer {

	public static void main(String[] args) throws Exception {
		System.out.println("发送方启动...");

		//指定端口号创建发送端,发送端的端口9999
		DatagramSocket socket = new DatagramSocket(9999);
		
		//准备数据
		String data = "我是一个数据";
		byte[] datas = data.getBytes();
		
		// 封装成DatagramPacket数据包,接收端的端口10000
		DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",10000));

		//发送数据
		socket.send(packet);

        //关闭资源
		socket.close();
	}

}

 接收端操作流程如下:

a、使用DatagramSocket创建接收端

b、准备DatagramPacket接收数据

c、阻塞式接受数据包

d、分析数据

f、释放资源

public class UDPClient {

	public static void main(String[] args) throws Exception {
		System.out.println("接收方启动中..");
        //指定端口10000,创建接收端
		DatagramSocket socket = new DatagramSocket(10000);

		//准备容器接受数据
		byte[] data = new byte[1024*60];
		DatagramPacket packet = new DatagramPacket(data, 0, data.length);
		
		//阻塞式接受包裹
		socket.receive(packet);

        //数据分析
		byte[] datas = packet.getData();
		String s = new String(datas);
		System.out.println("收到数据:"+s);

        //关闭资源
		System.out.println("接收方关闭...");
		socket.close();
	}

}

 4、TCP编程

tcp特点,通信双方需要建立连接,通过流传输数据。

TCP发送端流程:

1、指定接收端主机及端口号创建Socket

2、输入输出流操作。

3、关闭资源

public class TCPClient {

	public static void main(String[] args) throws Exception {
		System.out.println("-------client---------");
        //指定接收端IP及端口号,创建Socket对象
		Socket client = new Socket("localhost",8888);
		
        //数据IO操作
		DataOutputStream dos =  new DataOutputStream(client.getOutputStream());
		String data = "hi";
		dos.writeUTF(data);
		dos.flush();

        //关闭资源
		dos.close();
	}

}

TCP接收端流程:

1、指定端口号创建ServerSocket对象

2、阻塞式等待接收Socket,accpet()

3、输入输出流操作

4、关闭资源

public class TCPServer {

	public static void main(String[] args) throws IOException {
		System.out.println("-----server-----");
        //指定端口号,创建ServerSocket对象
		ServerSocket server = new ServerSocket(8888);
		
        //阻塞式等待连接
		Socket client = server.accept();
		System.out.println("一个客户端建立了连接...");
		
        //IO操作
		DataInputStream dis = new DataInputStream(client.getInputStream());
		System.out.println(dis.readUTF());
		
        //关闭资源
		dis.close();
		client.close();

	}

}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值