这里写自定义目录标题
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();
}
}
}
}
}
}