2021-10-28

java UDP客户端与服务器通信

UDP通信用于对与连接要求不强的通信,比如QQ
注意:如果使用终端运行此程序,需要注释或者删除程序开头的package cli或者package ser,在Eclipse中运行则不需要注释。

客户端:

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.




package cli;

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class cli {
	int port;
	InetAddress address;
	Scanner input = new Scanner(System.in);
	DatagramSocket socket;
	DatagramPacket packet;
	byte[] by = new byte[1024];
	JTextArea area;
	JTextField field;
	
	//UnknownHostException抛出InetAddress.getByName错误声明
	public cli() throws SocketException, UnknownHostException {
		//获取输入端口
		System.out.println("请输入服务器的端口号:");
		port = input.nextInt();
		System.out.println("port:"+port);
		//获取接收信息的电脑IP地址
		System.out.println("请输入服务器的ip地址");
		String ip = input.next();
		address = InetAddress.getByName(ip);
		System.out.println("network:"+address);
		//设置窗口
		set_Frame();
		//创建套接子
		socket = new DatagramSocket();
	}
	//主函数
	public static void main(String[] args) throws SocketException, UnknownHostException {
		cli mycli = new cli();
		mycli.go();
	}
	//主函数开始
	void go(){
		Thread receiveThread = new Thread(new receiveInfo());
		receiveThread.start();
	}
	//设置窗口
	void set_Frame() {
		JFrame frame = new JFrame();
		//设置窗口关闭时程序结束
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//创建控制面板
		JPanel panel1 = new JPanel();
		JPanel panel2 = new JPanel();
		//创建两行一列的网格控制面板
		JPanel panel3 = new JPanel(new GridLayout(2,1));
		JPanel panel4 = new JPanel();
		JPanel panel5 = new JPanel();
		//使用默认布局设置面板
		panel1.setLayout(new BorderLayout());
		area = new JTextArea();//15,50
		area.setLineWrap(true);
		area.setWrapStyleWord(true);
		area.setEditable(true);
		JScrollPane scrollpane = new JScrollPane(area);
		scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		field = new JTextField(20);
		//发送文本框添加键盘监听事件
		field.addKeyListener(new myKeyListener());
		JButton sendButton = new JButton("send");
		JButton button1 = new JButton("未知1");
		JButton button2 = new JButton("未知2");
		JButton button3 = new JButton("未知3");
		JButton button4 = new JButton("未知4");
		//按钮添加监听事件
		sendButton.addActionListener(new SendButtonListener());
		//控制面板添加组件
		panel1.add(scrollpane,BorderLayout.CENTER);
		panel2.add(field);
		panel2.add(sendButton);
		panel3.add(button1);
		panel3.add(button2);
		panel5.add(button3);
		panel5.add(button4);
		//窗口添加控制面板
		frame.getContentPane().add(panel1,BorderLayout.CENTER);
		frame.getContentPane().add(panel2,BorderLayout.SOUTH);
		frame.getContentPane().add(panel3,BorderLayout.WEST);
		frame.getContentPane().add(panel4,BorderLayout.EAST);
		frame.getContentPane().add(panel5,BorderLayout.NORTH);
		//frame.add(panel,BorderLayout.CENTER);
		//设置窗口的大小
		frame.setSize(400,500);
		//设置窗口为可见的
		frame.setVisible(true);
	}
	//发送信息
	public void send() {
		try {
			String info1 = field.getText();
			by = info1.getBytes();
			packet = new DatagramPacket(by,by.length,address,port);
			socket.send(packet);
			field.setText("");
			field.requestFocus();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	//按钮发送信息
	public class SendButtonListener implements ActionListener{
		public void actionPerformed(ActionEvent ev) {
			send();
		}
	}
	//键盘Enter发送信息
	class myKeyListener extends JPanel implements KeyListener{
		/**
		 * 用来表示类的不同版本之间的兼容性
		 */
		private static final long serialVersionUID = 1L;
		
		public void keyPressed(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_ENTER) {
				send();
			}
		}
		public void keyReleased(KeyEvent e) {
			
		}
		public void keyTyped(KeyEvent e) {
			
		}
	}
	//接收信息
	public class receiveInfo implements Runnable{
		public void run() {
			try {
				DatagramPacket packet2 = new DatagramPacket(by,by.length);
				while(true) {
					socket.receive(packet2);
					String info2 = new String(by,0,packet2.getLength());
					System.out.println("ser:"+info2);
					area.append(info2+"\n");
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
			} catch (SocketException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}
}

服务器端:



package ser;

import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.Thread;

public class ser {
	int port;
	Scanner input = new Scanner(System.in);
	String info;
	DatagramPacket packet;
	DatagramSocket socket;
	DatagramSocket socketSend;
	byte[] bySend;
	int IsPacket = 0;
	public ser() throws SocketException {
		System.out.println("请输入服务器的端口号:");
		port = input.nextInt();
		System.out.println("port:"+port);
		//socketSend = new DatagramSocket();
		socket = new DatagramSocket(port);
		bySend = new byte[1024];
	}
	public static void main(String[] args) throws SocketException {
		new ser().go();
	}
	void go() {
		Thread receiveThread = new Thread(new receiveInfo());
		receiveThread.start();
		Thread sendThread = new Thread(new sendInfo());
		sendThread.start();
	}
	public class receiveInfo implements Runnable{
	public void run() {
		try {
			//socket = new DatagramSocket(port);
			byte[] by = new byte[1024];
			packet = new DatagramPacket(by, by.length);
			while(true) {
				socket.receive(packet);
				IsPacket = 1;
				//packet.getData(()获取的其实是创建packet数据包时的地址by,0代表从数据包的第几位开始,getLength()代表数据包的长度
				info = new String(packet.getData(),0,packet.getLength());
				System.out.println("cli:"+info);
				try{
					Thread.sleep(2000);
				} catch (InterruptedException e){
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	}
	public class sendInfo implements Runnable{
		public void run() {
			while(true){
				if(IsPacket == 1){
					try {
						int portSend = packet.getPort();
						InetAddress addressSend = packet.getAddress();
							bySend = info.getBytes();
							DatagramPacket packet2 = new DatagramPacket(bySend,bySend.length,addressSend,portSend);		
							socket.send(packet2);
							IsPacket = 0;
							System.out.println("info:"+info);
							System.out.println("paceket2"+packet2.getPort()+"address"+packet2.getAddress());
					} catch (SocketException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					} catch (IOException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
				else{
					try{
						Thread.sleep(2000);
					} catch (InterruptedException e){
						e.printStackTrace();
					}

				}
			}
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值