网络编程日记(4-01-03)

本文介绍如何使用Java和UDP协议实现简单的网络聊天室应用,包括发送和接收消息的基本流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

04-01

一、网络协议和TCP/IP协议

IP地址和Port端口号:

本地回路的IP地址:127.0.0.1

UDPTCP区别

TCP:传输控制协议,是面向连接的通信协议

UDP:用户数据报协议,是无连接的通信协议

UDPTCP数据帧格式简单图例

 

协议类型

IP

目标IP

源端口

目标端口

帧序号

帧数据

协议类型用于区分UDPTCP

 

二、Socket:是网络驱动层提供给应用程序编程的接口和一种机制。

Socket可以比喻成港口码头

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立联系,告诉自己所对应的IPPort

 

  

三、JAVA中的网络编程类

位于Java.Net包中

DatagramSocket类用于UDP通信

ServerSocket类用于TCP通信的服务器端

Socket用于TCP通信的客户端和服务器

 

04-02

DatagramSocket三个构造函数:

Public DatagramSocket();

Public DatagramSocketint port);

Public DatagramSocketint portInetAddress laddr);

 

Close()

 

 

DatagramPacket是发送和接受数据的集装箱

构造函数:

public DatagramPacket(byte[] btf,int length);

public DatagramPacket(byte[] btf,int length, InetAddress laddr,int port);

InetAddress是表示计算机IP地址的一个类,具有getName()(静态方法)和getHostAddress()方法

getInetAddressgetPort()

getData()getLength()

最简单的UDP程序:

1、  字符串和字节数组之间的双向转换

2、  UDP接收程序必须先启动,才能接收UDP发送程序发送的数据

3、  Start命令打开新命令窗口的好处

4、  解决了发送字符串中文问题

发送程序:

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

 

 

public class UdpSend {

 

   

    public static void main(String[] args) throws Exception {

       DatagramSocket ds=new DatagramSocket();

       String info="黑马程序员开课啦!";

       ds.send(new DatagramPacket(info.getBytes(),info.getBytes().length,InetAddress.getByName("192.168.1.2"),3000));

       ds.close();

    }

 

}

 

 

接收程序:

import java.net.DatagramPacket;

import java.net.DatagramSocket;

 

 

public class UdpRecv {

 

    public static void main(String[] args) throws Exception {

 

       DatagramSocket ds=new DatagramSocket(3000);

       byte [] btf=new byte[1024];

       DatagramPacket dp=new DatagramPacket(btf,1024);

       ds.receive(dp);

       System.out.println(new String(dp.getData(),0, dp.getLength())+":"+

       dp.getAddress().getHostAddress()+":"+dp.getPort());

       ds.close();

    }

 

}

 

 

04-03

 

UDP编写网络聊天室

 

package frame;

 

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

 

public class Chat extends Frame {

 

    List list=new List(6);

    TextField tfIP= new TextField(15);

    TextField tfData= new TextField(20);

    DatagramSocket ds=null;

   

 

   

    public Chat(){

       try {

           ds=new DatagramSocket(3000);

       } catch (SocketException e1) {

           e1.printStackTrace();

       }

       this.add(list,"Center");

       Panel p=new Panel();

       this.add(p,"South");

      

       p.setLayout(new BorderLayout());

       p.add(tfIP,"West");

       p.add(tfData,"East");

      

      

       new Thread(new Runnable(){

 

           public void run() {

              byte [] btf1=new byte[1024];

              DatagramPacket dp2=new DatagramPacket(btf1,1024);

              while(true){

                 

              try {

                  ds.receive(dp2);

                  list.add(new String(dp2.getData(),0, dp2.getLength())+":"+

                         dp2.getAddress().getHostAddress()+":"+dp2.getPort());

              } catch (IOException e) {

                  if(!ds.isClosed()){

                  e.printStackTrace();

                  }

              }

             

              }

           }

       }).start();

      

      

      

       tfData.addActionListener(new ActionListener(){

           public void actionPerformed(ActionEvent e) {

              byte [] btf=tfData.getText().getBytes();

              DatagramPacket dp;

              try {

                  dp = new DatagramPacket(btf,btf.length,InetAddress.getByName(tfIP.getText()),3000);

                  ds.send(dp);

              } catch (Exception e1) {

                  e1.printStackTrace();

              }

             

              tfData.setText("");

           }

       });

       addWindowListener(new WindowAdapter(){

           public void windowClosing(WindowEvent e){

              dispose();

              System.exit(0);

           }

       });

          

      

      

    }

   

   

    public static void main(String[] args) {

 

       System.out.println("程序正在启动.....请稍等!");

       Chat mainFrame=new Chat();

       mainFrame.setSize(300,400);

       mainFrame.setTitle("聊天程序");

       mainFrame.setVisible(true);

       mainFrame.setResizable(false);

    }

 

}

 广播Ip地址为:255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值