JAVA网络编程【基于TCP和UDP协议】超详细!!!

ip地址:唯一标识主机的地址

端口号:用于标识计算机上某个特定的网络程序

InetAddress类

方法 说明
InetAddress InetAddress.getLocalHost() 静态方法,获取本机InetAddress对象(主机名+ip地址)
InetAddress InetAddress.getByName("主机名") 根据主机名或者域名获取ip地址对象(主机名+ip地址)/(域名+ip地址)
getHostName 获取InetAddress对象的主机名
getHostAddress 获取InetAddress对象的地址

InetSocketAddress抽象基类,子类SocketAddress

构造方法

java 复制代码
 public SocketAddress(InetAddress inetAddress,int port){...}  //InetAddress对象+端口号

客户端(socket)

复制代码
 
java 复制代码
Socket socket = new Socket(String host,int port);   //IP,端口号
 OutputStream out = socket.getOutputStream();
 out.write("hello,Server");
 out.close();
 socket.close();

方法

java 复制代码
 OutputStream getOutputStream()      //获取字节输出流对象
 IntputStream getInputStream()        //获取字节输入流对象

服务器端(SereverSocket)

java 复制代码
 SereverSocket serever = new SereverSocket(int port);   //端口号  要求这个端口号没被占用,否则报异常
 Socket server = serever.accept();   //等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信,当没                                      //有客户端连接这个端口会阻塞
 InputStream in = server.getInputStream();
 int i = 0;
 while((i = in.read())!=-1){
     System.out.print((char)i);
 }
 in.close();
 server.close();

如果要连续通话,在发送完一个数据的时候应该有个结束标记(没结束标记的话客户端或者服务端不知道什么时候发送结束,就会一直等待)

java 复制代码
 socket.shutDownOutout();    //写信息结束
 socket.shutDownInput();     //读信息结束

UDP

  • 没有明确的服务端和客户端,演变成数据的发送端和接收端

  • 接收数据和发送数据通过DatagramSocket对象完成

  • 将数据封装到DatagramPacket对象/装包

  • 当接收到DatagramPacket对象,需要进行拆包,取出数据

  • DatagramSocket可以指定在哪个端口接收数据

无连接、面向数据报的特征,即每次都是没有建立连接,一次发送全部数据报一次接受全部数据报。

基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket描述一个发送或接收数据报。(DatagramSocket类描述一个socket对象,本质是一个文件描述符,表示网卡设备的文件,通过读写socket文件的方式操作网卡

客户A(服务器端)

java 复制代码
 import java.io.IOException;
 import java.net.*;
 ​
 public class Server {
 ​
     public void getServer() throws IOException {
 ​
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
         DatagramSocket datagramSocket = new DatagramSocket(1111);
         byte[] bytes = new byte[1024];
         DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
         datagramSocket.receive(datagramPacket);
         String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());
         System.out.println("接收到客户端发送信息:"+message);
         System.out.println("正在向客户端发送信息。。。。。。。。。");
         String response = "我是服务器端,能收到";
         //获取数据包中的ip地址
         InetAddress address = datagramPacket.getAddress();
         //获取数据包中的端口号
         int port = datagramPacket.getPort();
         DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,address,port);
         datagramSocket.send(responsePacket);
         System.out.println("发送成功!!!!!");
         datagramSocket.close();
 ​
     }
 ​
     public static void main(String[] args) throws IOException {
         Server server = new Server();
         server.getServer();
     }
 ​
 }
复制代码
 ​

客户B(客户端)

java 复制代码
 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 ​
 public class Client {
 ​
     public void getClient() throws IOException {
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
         DatagramSocket datagramSocket = new DatagramSocket();
         System.out.println("发送信息。。。。。。。。。。。");
         String message = "我是客户端,能收到吗";
         DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(),0,message.getBytes().length,inetSocketAddress);
         datagramSocket.send(datagramPacket);
         System.out.println("发送成功!!");
 ​
         byte[] bytes = new byte[1024];
         DatagramPacket responsePacket = new DatagramPacket(bytes,0,bytes.length);
         datagramSocket.receive(responsePacket);
         String response = new String(responsePacket.getData(),0,responsePacket.getLength());
         System.out.println("服务器发送信息"+response);
 ​
         datagramSocket.close();
     }
 ​
     public static void main(String[] args) throws IOException {
         Client client = new Client();
         client.getClient();
     }
 }
 ​
相关推荐
军军君0112 小时前
Three.js基础功能学习一:环境资源及基础知识
开发语言·javascript·学习·3d·前端框架·threejs·三维
嵌入式-小王12 小时前
证书、加密相关知识点
网络·证书·加密
是垚不是土12 小时前
基于DDNS-Go动态域名解析配置:实现多网络线路冗余切换方案
运维·开发语言·网络·阿里云·golang·运维开发
@大迁世界12 小时前
JavaScript 框架的终结
开发语言·前端·javascript·ecmascript
天远云服12 小时前
Go 语言实战:构建高并发天远“全国自然人人脸比对 V3”微服务网关
java·大数据·微服务·golang
catchadmin12 小时前
PHP True Async 最近进展以及背后的争议
开发语言·php
zbtlink12 小时前
目前路由器是用宽带好还是插电话卡好?
网络·智能路由器
PPPPickup12 小时前
easychat项目复盘---管理端系统设置
java·开发语言·前端
挖矿大亨12 小时前
C++中的this指针
java·开发语言·c++
sheji341612 小时前
【开题答辩全过程】以 共享单车管理系统为例,包含答辩的问题和答案
java