java中TCP、UDP的简单网络编程

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-08 17:39:57

一、有关网络编程概念

传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字是(210.37.145.1:23)。
总之,套接字Socket=(IP地址:端口号)。
有关网络编程中的API:

  • java.net包下的InetAddress类:此类表示互联网协议(IP)地址。
  • (1)InetAddress getLocalHost()
  • 域名:www.baidu.com
  • 因为IP地址的数字较长,不方便记忆。所以设计了域名,来与IP地址对应。
  • 由域名解析器(DNS)来解析对应关系。InetAddress getByName(xx) 来获取主机名和ip地址

二、TCP网络编程

2.1 TCP网络编程的客户端

  • TCP网络编程的客户端:
  • 1.创建一个Socket对象,并且指定“服务器”的IP地址和端口号;
  • 主动与服务器建立连接
  • 如果服务器没开或端口号、IP地址错误,会报异常。 ConnectionException
  • 2.接收数据
  • 3.关闭连接
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
 public static void main(String[] args) throws UnknownHostException, IOException {
  Socket client = new Socket("192.168.235.1",8888);
  //2.接收数据
  InputStream in = client.getInputStream();
  int len;
  byte[] data = new byte[1024];
  while((len = in.read(data) ) != -1) {
    System.out.println(new String(data, 0,len));
  }
  //3.关闭连接
  in.close();
  client.close();
 }
}

2.2 TCP网络编程的服务端

TCP网络编程的服务器端:

  • 步骤:

  • 1.创建一个ServerSocket的对象,指定IP地址和监听的端口号;

  • ip地址没有指定默认是运行该程序的本机地址。

  • 2.监听客户端的连接,如果没有连接,那么该方法阻塞

  • 3.如果有人连接就可以通信

  • 1)接收数据

  • 2)发送数据

  • 4.不通信了,断开连接

  • (1)关闭从socket获取的输入输出流对象,也会导致socket关闭。

  • 习惯上还是会先关IO流再关socket。

  • (2)一旦关闭不能在通信了,只能重新连接。

  • (3)TCP程序最好能够正确关闭,因为TCP程序是面向连接的,

  • TCP程序连接之前有三次握手,关闭对“四次挥手”才能关闭。

  • 一次TCP连接的成本很高,因此要珍惜。

  • Socket中有这样的方法:

  • (1)getOutputStream()

  • (2)getInputStream()

  • (3)getInetAddress():获取对方的IP地址

  • 小技巧:如果既要读字符串又要读字节数据,用DataInputStream;

  • 如果网络编程,需要把写的通道关闭,不关闭读的通道,可以用socket.shoutdownOutput();方法

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
 public static void main(String[] args) throws IOException {
  //1.创建一个ServerSocket的对象,指定IP地址和监听的端口号
  ServerSocket server = new ServerSocket(8888);
  //2.监听(接受)客户端的连接
  Socket client = server.accept();
  System.out.println("一个客户端连接成功");
  //3.发送数据,发送“欢迎你连接”
  //这里发送数据就算写数据,这个数据是写到网络中,写给客户端的。
  //写数据要用到输出流,而且此处是字节流
  OutputStream out = client.getOutputStream();
  out.write("欢迎你连接".getBytes());
  //4.不通信了,断开连接
  out.close();
  client.close();
  //5.如果需要,关闭服务器
  server.close();
 }
}

三、UDP网络编程

3.1 UDP发送端

  • UDP编程:
  • DatagramSocket
  • DatagramPacket
  • UDP的发送端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class UdpBasic {
 public static void main(String[] args) throws Exception {
  //先创建DatagramSocket对象
  //可以不指定端口号和IP地址,IP默认本机
  DatagramSocket ds = new DatagramSocket();
  //2.准备发送的数据
  String str = "大家新年好!";
  byte[] data = str.getBytes();
  //3.把数据包装成一个数据报
  //DatagramPacket(字节数组,数据长度,接收方的主机名和IP地址,接收方监听端口号)
  InetAddress ip = InetAddress.getByName("192.168.235.1");
  DatagramPacket dp = new DatagramPacket(data,data.length,ip,9999);
  //4.发送
  ds.send(dp);//通过socket对象发送数据
  System.out.println("发送完毕");
  
  //5.关闭
  ds.close();
 }
}

3.2 UDP的接收方

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceive {
 public static void main(String[] args) throws Exception {
  //1.先创建DatagramSocket对象,需要指定端口号
  DatagramSocket ds = new DatagramSocket(9999);
  //2.准备接收数据的数据报和字节数组
  byte[] data = new byte[1024];
  DatagramPacket dp = new DatagramPacket(data, data.length);
  System.out.println("等待数据中.....");
  //3.接收数据
  ds.receive(dp);//通过socket接收,这是个阻塞方法
  //4.显示数据
  String message = new String(dp.getData(),0,dp.getLength());
  System.out.println(message);
  //5.关闭
  ds.close();
 }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!