版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/69415435
一、定义简介:
1. TCP是一个面向连接的、可靠的协议(transmission control protocol)
专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
2. UDP是一个无连接,不可靠的协议(user datagram protocol )
数据的发送方只负责将数据发送出去,数据的接受方只负责接受数据。发送方和接收方不会相互确认数据的传输是否成功。
3. Socket编程:Socket客户/服务器程序开发
所谓的客户/服务器,是一种在基于网络环境的分布处理过程中,使用基于连接的网络通信模型。该通信模型首先在客户机和服务器之间定义一套通信协议,并创建一Socket(套接字)类,利用这个类建立一条可靠的链接;然后,客户/服务器再在这条连接上可靠地传输数据。客户端发出请求,服务器监听来自客户机地请求,并为客户端 提供响应服务。这就是典型的“请求-应答”模式。
二、简单通信实践:直接上代码,可直接运行
1. TCP通信,需要创建两个类,一个是客户端(Client),一个是服务器端(Server)
(1)Client类:
public class Client { public static void main (String [] args){ //创建客户端对象 System.out.println("客户端启动~"); try { Socket socket=new Socket("127.0.0.1",23456); OutputStream out=socket.getOutputStream(); PrintWriter pw=new PrintWriter(out); System.out.println("客户端:");//客户端写入 Scanner sc=new Scanner(System.in); pw.println(sc.nextLine()); pw.flush(); InputStream in=socket.getInputStream();//客户端接收 InputStreamReader inr=new InputStreamReader(in); BufferedReader bf=new BufferedReader(inr);//字符读取 String s=bf.readLine(); System.out.println(s); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
AI 代码解读
(2)Server类:
public class Server { public static void main(String [] args) throws IOException{ //创建服务端接收 System.out.println("服务端启动~"); ServerSocket server=new ServerSocket(23456); Socket socket=server.accept();//接收客户端 InputStream in=socket.getInputStream();//接收字节流数据 InputStreamReader inr=new InputStreamReader(in); BufferedReader bf=new BufferedReader(inr);//字符流读取 String s=bf.readLine(); System.out.println(s); OutputStream out=socket.getOutputStream(); PrintWriter pw=new PrintWriter(out); System.out.println("客户端:");//客户端写入 Scanner sc=new Scanner(System.in); pw.println(sc.nextLine());//注意使用换行方法 pw.flush();//可以释放资源也可以不释放资源,最后再关闭流 server.close(); socket.close(); } }
AI 代码解读
2. UDP通信,也需要创建两个类,一个是客户端(UDP_Client),一个是服务端(UDP_Server)
(1)UDP_Client类:
public class UDP_Client { public static void main(String [] args) throws SocketException, UnknownHostException{ System.out.println("客户端启动~~"); DatagramSocket socket=new DatagramSocket();//创建socket通道 System.out.println("请输入发送信息:"); Scanner sc=new Scanner(System.in); String s=sc.next(); byte[]by=s.getBytes(); DatagramPacket packet=new DatagramPacket(by, 0,by.length, //创建packet包 InetAddress.getByName("127.0.0.1"), 10087); try { socket.send(packet); } catch (IOException e) { e.printStackTrace(); } socket.close(); } }
AI 代码解读
(2)UDP_Server类:
public class UDP_Server { public static void main(String [] args) throws SocketException{ DatagramSocket socket = new DatagramSocket(10087); System.out.println("服务端启动~~"); byte[]by=new byte[socket.getReceiveBufferSize()];//获取缓冲区长度 DatagramPacket packet = new DatagramPacket(by, by.length);//创建数据包对象 try { socket.receive(packet); String message=new String(by,0,by.length); System.out.println(message); } catch (IOException e) { e.printStackTrace(); } socket.close(); } }
AI 代码解读
三、注意事项:
1.TCP通信和UDP通信都是先启动服务端,然后再启动客户端,然后才可以进行通信;
2. 以上的TCP通信和UDP通信分别属于不同的代码块,可按需复制需要的代码块;