java系列讲座二:socket网络通信实现聊天软件项目讲解(udp)

     2022-03-20     431

关键词:

    上一篇我们讲了通过TCP方式实现网络通信软件开发的原理,思路及实现,今天跟大家谈谈Socket通信中UDP方式通信的软件开发步骤及主要代码讲解,UDP实现方式实现的通信软件特点是不分客户端与服务器端,一个程序既是客户端与是服务器端,典型软件是一些局域网的聊天软件,如飞鸽等软件。

    UDP方式通信主要用到了java.net包中的3个类分别是DatagramPacket类,DatagramSocket类与InetAddress类,下面通过实现一个简易聊天软件小项目来讲解他们的使用方法,代码如下:

package T16;


import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;

import java.util.Date;


import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JEditorPane;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

/**

 * UDP通信的聊天软件

 * 

 * */

public class UDPChat extends JFrame implements ActionListener{


private JLabel lblPort,lblAddr,lblPort2;

private JTextField txtPort,txtAddr,txtPort2;

private JButton btnConn,btnSend,btnClose;

private JEditorPane txtReceive,txtSend;

public UDPChat(int n){

}

private UDPChat(int n,int m){

}

public UDPChat() {

super("UDP通信的聊天软件");

lblPort = new JLabel("本机端口:",JLabel.RIGHT);

lblPort2 = new JLabel("对方端口:",JLabel.RIGHT);

lblAddr = new JLabel("对方地址:",JLabel.RIGHT);

txtPort = new JTextField("8888",5);

txtPort2 = new JTextField("9999",5);

InetAddress ipaddr =null;

try {

ipaddr = InetAddress.getLocalHost();

} catch (UnknownHostException e) {

e.printStackTrace();

}

txtAddr = new JTextField(ipaddr.getHostAddress(),10);

btnConn = new JButton("连接(C))");

btnConn.setMnemonic(‘C‘);

JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

topPanel.add(lblPort);

topPanel.add(txtPort);

topPanel.add(lblAddr);

topPanel.add(txtAddr);

topPanel.add(lblPort2);

topPanel.add(txtPort2);

topPanel.add(btnConn);

txtReceive = new JEditorPane();

txtSend = new JEditorPane();

JPanel centerPanel = new JPanel(new GridLayout(2,1,5,10));

centerPanel.add(txtReceive);

txtReceive.setBorder(BorderFactory.createLoweredBevelBorder());

//接收框不能编辑

txtReceive.setEditable(false);

txtSend.setBorder(BorderFactory.createLoweredBevelBorder());

centerPanel.add(txtSend);

btnSend = new JButton("发送(S)");

btnSend.setMnemonic(‘S‘);

btnClose = new JButton("退出(X)");

btnClose.setMnemonic(‘X‘);

JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));

bottomPanel.add(btnSend);

bottomPanel.add(btnClose);

add(topPanel,BorderLayout.NORTH);

// centerPanel.setBackground(Color.RED);

add(centerPanel,BorderLayout.CENTER);

add(bottomPanel,BorderLayout.SOUTH);

btnConn.addActionListener(this);

btnSend.addActionListener(this);

btnClose.addActionListener(this);

//发送按钮禁用

btnSend.setEnabled(false);

setSize(600, 400);

setVisible(true);

setLocationRelativeTo(null);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}


//创建内部类,实现接收线程

class ReceiveThread extends Thread{

DatagramSocket socket;

public ReceiveThread() {

try{

int port = Integer.parseInt(txtPort.getText().trim());

socket = new DatagramSocket(port);

}catch(Exception e){

e.printStackTrace();

}

}

@Override

public void run() {

byte[] b = new byte[1024];

DatagramPacket packet = new DatagramPacket(b,b.length);

while(true){

try {

//接收数据

socket.receive(packet);

//转换为字符串

String str = new String(b,0,packet.getLength());

//显示在接收框

String content = txtReceive.getText();

content += new Date().toLocaleString()+" ";

content += str+" ";

txtReceive.setText(content);

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

// UDPChat chat = new UDPChat();

try {

Class.forName("T16.UDPChat").newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}


@Override

public void actionPerformed(ActionEvent e) {

if(e.getSource()==btnConn){

btnConn.setEnabled(false);

btnSend.setEnabled(true);

//启动线程

new ReceiveThread().start();

}else if(e.getSource()==btnSend){

//发送内容

String str = txtSend.getText().trim();

if(str.equals("")){

JOptionPane.showMessageDialog(this, "请输入要发送的内容");

return;

}

//把要发送的内容显示到接收框

String content = txtReceive.getText();

content += new Date().toLocaleString()+" ";

content += str+" ";

txtReceive.setText(content);

try {

//设置对方IP地址

InetAddress ip = InetAddress.getByName(txtAddr.getText().trim());

//设置对方的端口

int port = Integer.parseInt(txtPort2.getText().trim());

//创建发送包

byte b[] = str.getBytes();

DatagramPacket p = new DatagramPacket(b,b.length,ip,port);

//创建DatagramSocket发送

DatagramSocket socket = new DatagramSocket();

//发送

socket.send(p);

//清空发送框的内容

txtSend.setText("");

} catch (UnknownHostException e1) {

e1.printStackTrace();

} catch (SocketException e2) {

e2.printStackTrace();

} catch (IOException e3) {

e3.printStackTrace();

}

}else if(e.getSource()==btnClose){

System.exit(0);

}

}

}


该程序必须同启动2个实例才能实现在局域网聊天,互相设置对方的端口与IP地址即可。

本人从事软件项目开发20年,10年的Java工程师系列课程的教学工作,录制30多门精品视频课程,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂,

关于网络即时通讯,多线程等技术的详细介绍内容很多,如果大家有兴趣可以看看我的 java从入门到精通+QQ即时通讯软件项目实训的教学视频,链接地址:http://edu.51cto.com/course/6946.html 

java系列讲座一:tcp方式socket通信案例讲解

开发网络通信软件,如QQ,阿里旺旺等即时通讯软件时,Socket通信是必备的基础知识,今天跟大家谈谈Socket通信中TCP方式通信的软件开发步骤及主要代码讲解:第一步:开发服务器端程序Server.java,源代码如下:package T16;import... 查看详情

基于java实现hello/hi简单网络聊天程序

目录Socket简要阐述Socket的概念Socket原理hello/hi的简单网络聊天程序实现服务器端客户端程序执行结果跟踪分析调用栈&LinuxAPI对比创建ServerSocket调用栈图示源码分析Socket绑定调用栈图示源码分析Socket监听调用栈图示源码分析Socket... 查看详情

java是如何实现聊天功能的?

Java可以使用Socket编程实现聊天功能。Socket是一种网络通信协议,它可以在不同的主机之间传输数据。在聊天功能中,一般有客户端和服务器两个角色。客户端是发送消息的一方,它需要创建一个Socket对象,指定要连接的服务器... 查看详情

java实现一个hello/hi的简单的网络聊天程序(代码片段)

...接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程 查看详情

java的socket连接,聊天室通信实现(代码片段)

...那么一个程序要怎么才能联网呢?接下来我们来聊聊socket连接。认识socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TC 查看详情

第92题java高级技术-网络编程11(简易聊天室6:使用socket通信)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第92天,每天我会提供一篇文章供群成员阅读(不需要订阅付钱),... 查看详情

第92题java高级技术-网络编程11(简易聊天室6:使用socket通信)(代码片段)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第92天,每天我会提供一篇文章供群成员阅读(不需要订阅付... 查看详情

第93题java高级技术-网络编程12(简易聊天室7:使用socket传递对象)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第93天,每天我会提供一篇文章供群成员阅读(不需要订阅付钱),... 查看详情

第94题java高级技术-网络编程13(简易聊天室8:使用socket传递图片)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第94天,每天我会提供一篇文章供群成员阅读(不需要订阅付钱),... 查看详情

第93题java高级技术-网络编程12(简易聊天室7:使用socket传递对象)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第93天,每天我会提供一篇文章供群成员阅读(不需要订阅付钱),... 查看详情

第95题java高级技术-网络编程14(简易聊天室9:使用socket传递音频)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解多学一个知识点四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第95天,每天我会提供一篇文章供群成员阅读(不需... 查看详情

java利用tcp编程实现简单聊天室

...、基于字节流的传输层通信协议,在Java中我们利用ServerSocket类来建立服务端,利用Socket类来建立客户端。这里要注意,在TCP中,Socket实际上是指Ser 查看详情

游戏开发实战unity使用socket通信实现简单的多人聊天室(万字详解|网络|tcp|通信|mirror|networking)(代码片段)

文章目录一、前言二、简单的Socket通信:多人聊天室1、服务端:python代码1.1、importsocket1.2、构造socket对象1.3、绑定/监听端口1.3、监听客户端连接1.4、接收客户端socket消息1.5、多线程1.6、完整代码:game_server.py2、客户... 查看详情

游戏开发实战unity使用socket通信实现简单的多人聊天室(万字详解|网络|tcp|通信|mirror|networking)(代码片段)

文章目录一、前言二、简单的Socket通信:多人聊天室1、服务端:python代码1.1、importsocket1.2、构造socket对象1.3、绑定/监听端口1.3、监听客户端连接1.4、接收客户端socket消息1.5、多线程1.6、完整代码:game_server.py2、客户... 查看详情

一个简单的网络聊天程序实现

...接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就 查看详情

java的socket连接,聊天室通信实现(代码片段)

...那么一个程序要怎么才能联网呢?接下来我们来聊聊socket连接。认识socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐... 查看详情

java的socket连接,聊天室通信实现(代码片段)

...那么一个程序要怎么才能联网呢?接下来我们来聊聊socket连接。认识socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐... 查看详情

第90题java高级技术-网络编程9(简易聊天室4:获得socket)(代码片段)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第90天,每天我会提供一篇文章供群成员阅读(不需要订阅付... 查看详情