黑马程序员——网络编程

                                                           ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

  Java提供了InetAddress来代表IP地址,InetAddress类没有提供构造器,而是提供了如下两个静态方法来获取InetAddress实例。getByName(String host)方法据主机获取对应的InetAddress对象,getByAddress(byte[] addr)根据原始IP地址来获取对应的InetAddress对象,InetAddress提供了三个方法来获取实例对应的IP地址和主机名。String getCanonicalHostName()获取此IP地址的全限定域名,getHostAddress,获取此IP的地址字符串。

InetAddress ip=new InetAddress.getName("www.baidu.com");
ip.getHostAddress();

  Socket就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据就是在两个Socket间通过IO传输。

  UDP是User Datagram Protocol的缩写,不用建立链路,是不可靠的协议,对于实时性要求很强的场合比较适用。使用DatagramSocket和DatagramPacket发送接收数据,第一步是建立发送端与接收端,第二步是建立数据包,第三步是调用Socket的发送接收方法,第四步是关闭Socket。发送与接收端是两个独立的程序。当客户端与服务器使用UDP协议的时候,实际上并没有明显的服务器与客户端,因为双方都需要建立一个DatagramSocket对象用于接收发送数据,然后使用DatagramPacket对象作为传输数据的载体。通常固定IP与端口的对象所在的程序称之为服务器。一旦创立了DatagramSocket实例之后,我们使用两个方法来接收发送数据,receive()与send()方法。

   接收端的代码:

DatagramPacket packet=new DatagramPacket(buf,256);
socket.receive(packet);
    发送端的代码:发送端的代码里有数据需要到达的目的地址,包括IP和端口,数据的发送时需要send方法来完成的。

DatagramPacket packet=new DatagramPacket(buf,length,address,port);
socket.send(packet);

   我们知道在接收端接收到一些信息的时候,往往需要给发送端反馈一些信息,可是UDP传输是面向非连接的,我们需要调用以下方法来获取发送者的IP和端口。getAddress(),获取发送接收的IP地址,getPort()获取发送接收端口,getSocketAddress()返回此数据包的目标SocketAddress。

   UDP也是要调用底层资源,所以我们在结束完了后记得关闭资源close方法。  

   下面以服务端的UDP代码来说明其协议的写法。

   

public class UDPServer {
    private static final int PORT = 5000;
    private DatagramSocket dataSocket;
    private DatagramPacket dataPacket;
    private byte receiveByte[];
    private String receiveStr;

    public UDPServer() {
        Init();
    }

    public void Init() {
        try {
            dataSocket = new DatagramSocket(PORT);
            receiveByte = new byte[1024];
            dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
            receiveStr = "";
            int i = 0;
            while (i == 0)// 无数据,则循环

            {
                dataSocket.receive(dataPacket);
                i = dataPacket.getLength();
                // 接收数据

                if (i > 0) {
                 <span style="color:#ff0000;">   // 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点
</span>
                    receiveStr = new String(receiveByte, 0, dataPacket.getLength());
                    System.out.println(receiveStr);
                    i = 0;// 循环接收

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
        new UDPServer();
    }
}
    我们在建立了服务端后,就要建立客户端,为了两者的数据的传输,端口的代码需要尤为注意。

public class UDPClient {
    private static final int PORT = 4561;
    private DatagramSocket dataSocket;
    private DatagramPacket dataPacket;
    private byte sendDataByte[];
    private String sendStr;

    public UDPClient() {
        Init();
    }

    public void Init() {
        try {
            // 指定端口号,避免与其他应用程序发生冲突

            dataSocket = new DatagramSocket(PORT+1);
            sendDataByte = new byte[1024];
            sendStr = "UDP方式发送数据";
            sendDataByte = sendStr.getBytes();
            dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,
                    InetAddress.getByName("localhost"), PORT);
            dataSocket.send(dataPacket);
        } catch (SocketException se) {
            se.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }

    public static void main(String args[]) {
        new UDPClient();
    }
}
  前面是UDP不可靠的链接方式,TCP作为面向链接的,通信之前需要建立连接的。我们通过一些方法来创建TCP服务器,Java中接收其他的通信实体连接请求的是SeverSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。Socket accept();接收到客户端的socket的连接请求,该方法返回一个与客户端socket对应的socket,否则线程被阻塞。

    ServerSocket(int port)用于指定端口来创建一个serversocket,因为调用了底层的资源,所以需要使用close来关闭serversocket . 

ServerSocket ss=new ServerSocket();
while(true)
{
   Socket s=ss.accept();
}

  我们需要使用的Socket来进行通信 ,创建Socket(),Socket提供了两个方法来获取数据:InputStream getInputStream()返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。同样的我们知道OutputStream getOutputStream()返回该Socket对象对象的输出流,让程序向socket输出数据。

  

下面我们基础测试里的一道题来说明接收与发送的代码


  1. public class ClientDemo {
  2.         public static void main(String[] args) throws IOException {

  3.                 // 创建发送端Socket对象
  4.                 Socket s = new Socket("192.168.1.109", 10010);

  5.                 q: while (true) {
  6.                         // 封装键盘录入
  7.                         BufferedReader br = new BufferedReader(new InputStreamReader(
  8.                                         System.in));
  9.                         // 把通道内的输出流封装为字符流
  10.                         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
  11.                                         s.getOutputStream()));
  12.                         String line = null;
  13.                         while ((line = br.readLine()) != null) {
  14.                                 // 发送数据
  15.                                 bw.write(line);
  16.                                 // 换行
  17.                                 bw.newLine();
  18.                                 // 刷新数据
  19.                                 bw.flush();

  20.                                 // 判断结束标记
  21.                                 if (line.equals("over")) {
  22.                                         break q;
  23.                                 }

  24.                                 // 获取服务端发回的数据
  25.                                 BufferedReader brReader = new BufferedReader(
  26.                                                 new InputStreamReader(s.getInputStream()));
  27.                                 String str = null;
  28.                                 while ((str = brReader.readLine()) != null) {
  29.                                         // 将服务端发过来的数据输出到控制台
  30.                                         System.out.println(str);
  31.                                         break;
  32.                                 }

  33.                         }

  34.                 }
  35.                 // 关闭资源
  36.                 s.close();

  37.         }
  38. }
  1. public class ServerDemo {
  2.         public static void main(String[] args) throws IOException {
  3.                 // 创建服务端对象,并指定好端口
  4.                 ServerSocket ss = new ServerSocket(10010);

  5.                 q: while (true) {
  6.                         // 监听客户端连接
  7.                         Socket s = ss.accept();

  8.                         // 对通道内的数据进行包装
  9.                         BufferedReader br = new BufferedReader(new InputStreamReader(
  10.                                         s.getInputStream()));
  11.                         String line = null;
  12.                         while ((line = br.readLine()) != null) {
  13.                                 // 判断结束标记
  14.                                 if (line.equals("over")) {
  15.                                         break q;
  16.                                 }

  17.                                 // 将得到的数据反转
  18.                                 String data = reverseString(line);
  19.                                 // 将反转后的数据发送给客户端
  20.                                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
  21.                                                 s.getOutputStream()));
  22.                                 bw.write("Server: " + data);
  23.                                 bw.newLine();
  24.                                 bw.flush();

  25.                         }
  26.                 }
  27.                 // 释放资源
  28.                 ss.close();
  29.         }

  30.         // 数据反转方法
  31.         private static String reverseString(String line) {

  32.                 StringBuffer sb = new StringBuffer(line.length());

  33.                 for (int i = line.length() - 1; i >= 0; i--) {
  34.                         char c = line.charAt(i);
  35.                         sb.append(c);
  36.                 }

  37.                 return sb.toString();
  38.         }
  39. }
   

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
教程非常不错,价值280元,绝对是干货 Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 IC MP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础(四) TCP特点 TCP报文格式 连接建立三次握手 连接终止四次握手 TCP如何保证可靠性 05TCPIP基础(五) 滑动窗口协议 UDP特点 UDP报文格式 Linux网络编程之socket编程篇 06socket编程(一) 什么是socket IPv4套接口地址结构 网络字节序 字节序转换函数 地址转换函数 套接字类型 07socket编程(二) TCP客户/服务器模型 回射客户/服务器 socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射客户/服务器 getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九) select 读、写、异常事件发生条件 用select改进回射服务器程序。 15socket编程(十) 用select改进第八章点对点聊天程序 16socket编程(十一) 套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇 23进程间通信介绍(一) 进程同步与进程互斥 进程间通信目的 进程间通信发展 进程间通信分类 进程间共享信息的三种方式 IPC对象的持续性 24进程间通信介绍(二) 死锁 信号量 PV原语 用PV原语解决司机与售票员问题 用PV原语解决民航售票问题 用PV原语解决汽车租赁问题 25System V消息队列(一) 消息队列 IPC对象数据结构 消息队列结构 消息队列在内核中的表示 消息队列函数 26System V消息队列(二) msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列与共享内存传递数据对比 mmap函数 munmap函数 msync函数 29System V共享内存 共享内存数据结构 共享内存函数 共享内存示例 30System V信号量(一) 信号量 信号量
黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值