UDP聊天

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ChatDemo {

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

        /*
         * 通过UDP协议 完成一个聊天程序。 一个负责发送数据的任务,一个负责接收数据的任务 两个任务需要同时执行,可以使用多线程技术
         */

        //创建socket服务
        //发送端
        DatagramSocket send = new DatagramSocket(8888);
        DatagramSocket rece = new DatagramSocket(10001);

        new Thread(new Send(send)).start();
        new Thread(new Rece(rece)).start();

    }

}

// 负责发送的任务,通过UDP的socket发送
class Send implements Runnable {
    // 任务对象一建立,需要socket对象
    private DatagramSocket ds;

    public Send(DatagramSocket ds) {
        super();
        this.ds = ds;
    }

    @Override
    public void run() {
        // 具体的发送数据的任务内容
        // 1.要发送的数据来自哪里?键盘录入
        BufferedReader bufr = new BufferedReader(new InputStreamReader(
                System.in));

        // 1.1读取数据
        String line = null;
        try {
            while ((line = bufr.readLine()) != null) {

                // 1.2将数据封装成字节数组
                // 2.将数据封装到数据包中。
                byte[] buf = line.getBytes();
                DatagramPacket dp = new DatagramPacket(buf, buf.length,
                        InetAddress.getByName("192.168.17.255"), 10001);//255是广播,在该网路段的所有主机都能收到

                // 3.将数据包发送出去。
                ds.send(dp);

                if ("over".equals(line)) {
                    break;
                }
            }
            ds.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

// 负责接收的任务
class Rece implements Runnable {

    private DatagramSocket ds;

    public Rece(DatagramSocket ds) {
        super();
        this.ds = ds;
    }

    @Override
    public void run() {
        while (true) {
            // 接收的具体的任务内容
            // 1.因为接收的数据最终都会存储到数据包中,而数据包中必须有字节数组。
            byte[] buf = new byte[1024];

            // 2.创建数据包对象
            DatagramPacket dp = new DatagramPacket(buf, buf.length);

            // 3.将数据存储到数据包中
            try {
                ds.receive(dp);
                // 4.获取数据
                String ip = dp.getAddress().getHostAddress();

                String data = new String(dp.getData(), 0, dp.getLength());

                System.out.println(ip + ":" + data);

                if("over".equals(data)){
                    System.out.println(ip+"......离开聊天室");
                }

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

        }
    }

}
时间: 2024-10-16 23:19:12

UDP聊天的相关文章

java UDP聊天与文件传输

package rgy.com.UDP3; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.io.Fil

UDP聊天室

pub.h   定义了一些消息的结构和宏变量 #ifndef _PUB_H_ #define _PUB_H_ #include <list> #include <algorithm> using namespace std; // C2S #define C2S_LOGIN            0x01 #define C2S_LOGOUT            0x02 #define C2S_ONLINE_USER        0x03 #define MSG_LEN  

TCP、UDP练习题 (UDP聊天程序、TCP上传文本文件和图片文件)

TCP.UDP编程练习 TCP ☆上传文本文件 读取一个本地文本文件,将数据发送到服务端,服务器端对数据进行存储. 存储完毕后,给客户端一个提示. 一.解题思路 客户端:(1) 创建Socket对象----用服务器的ip+端口号 (2)读取文件内容 (3)通过socket把内容发送给服务器端(把socket中的输出流包装成"打印流"来进行发送文本,是一种比较安全的输出方式,不会出现失真.) 服务器端:(1) 创建服务器socket---ServerSocket (2)通过ServerS

python 入门 socket 实现udp聊天室

什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Python 中,我们用 socket()函数来创建套接字,语法格式如下: socket.socket([family[, type[, proto]]]) 参数 family: 套接字家族可以使AF_UNIX或者AF_INET type: 套接字类型可以根据是面向连接的还是非连接分为SOCK

UDP聊天器 服务器版 支持离线消息 支持净网过滤

#服务器端 #========================================================== #导入模块import socketimport threadingimport re#设置全局变量flagflag = 0#设置离线消息列表msg_list = []#创建udp套接字udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#绑定ip端口udp_server_socke

python—多任务版udp聊天机器人

将多任务(多线程)引入到udp聊天机器人,可以实现同时发送消息和接收消息 1 import socket 2 import threading 3 4 5 def udp_send(udp_socket,ip,port): 6 while True: 7 try: 8 # 获取发送的信息 9 data = input('请输入要发送的信息:') 10 udp_socket.sendto(data.encode('gbk'), (ip,port)) 11 12 except Exception a

[Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能

何为UDP(User Datagram Protocol)? 从baidu摘过来一段:UDP,用户数据报协议,与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层.根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议.UDP协议的主要作用是将网络数据流量压缩成数据包的形式.一个典型的数据包就是一个二进制数据的传输单位.每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据. UDP报文没有可靠性保证.顺序保证和流量控制字段等,可

UDP聊天程序------java

通过键盘录入获取要发送的信息. 将发送和接收分别封装到两个线程中. package cn.hncu.UDP; <span style="font-size:32px;color:#ff0000;">//发送方</span> import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketExcept

UDP聊天室 java

要求实现一个聊天室,能同时接收和发送信息. 下面的代码用两个线程在处理发送和接收信息.信息在网际的传递采用UDP协议.这种方法不需要建立连接,因此比较高效,但是正因补永济哪里连接,因此会有丢包的不安全性. import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.In