利用java实现UDP(二)

振哥哥 2014-07-01 05:10:10
本帖子接 《利用java实现UDP》这个帖子:
客户端:
UDPClientBean.java

package UDPClient;

import java.io.*;
import java.net.*;

class UDPClientBean{

private DatagramSocket dSocket;
private int ServerPort;
private int ClientPort;
private InetAddress ServerIP;
private InetAddress ClientIP;
private String content;

//无参构造函数
public UDPClientBean() throws SocketException,UnknownHostException {

ServerPort = 1001;
ClientPort =1111;
content = "";
ClientIP = InetAddress.getLocalHost();
ServerIP = InetAddress.getLocalHost();
dSocket = new DatagramSocket(ClientPort);
}
// 信息发送函数
public void sendToServer() throws IOException{
byte[] Buffer = getContent().getBytes(); //将要发送的信息给Buffer变量
DatagramPacket dPacket = new DatagramPacket(Buffer,Buffer.length,getServerIP(),getServerPort());
// 创建DatagramPacket对象dPacket,并指定要发送对象的服务器的IP地址与端口号
dSocket.send(dPacket); // dSocket对象调用send函数发送信息
setContent("");
}
// 信息接收函数
public String receiveFromServer() throws IOException{
byte[] buffer = new byte[1024];
DatagramPacket dPacket = new DatagramPacket(buffer,buffer.length);
// 创建DatagramPacket对象dPacket
dSocket.receive(dPacket); // dSocket对象调用receive函数接收信息
String receive_str = new String(dPacket.getData(),0,dPacket.getLength());
return receive_str; // 返回接收到的信息
}
// 下面都是UDPClientBean类的各个成员变量的get和set方法
public DatagramSocket getdSocket() {
return dSocket;
}

public void setdSocket(DatagramSocket dSocket) {
this.dSocket = dSocket;
}

public int getServerPort() {
return ServerPort;
}

public void setServerPort(int serverPort) {
ServerPort = serverPort;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public InetAddress getServerIP() {
return ServerIP;
}

public void setServerIP(InetAddress serverIP) {
ServerIP = serverIP;
}

public int getClientPort() {
return ClientPort;
}

public void setClientPort(int clientPort) {
ClientPort = clientPort;
}

public InetAddress getClientIP() {
return ClientIP;
}
public void setClientIP(InetAddress clientIP) {
ClientIP = clientIP;
}
}


UDPClient.java

package UDPClient;

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

public class UDPClient extends JApplet {

private String content;
private UDPClientBean client;

private JTextField jtf_ServerIP = new JTextField(10);
private JTextField jtf_ServerPort = new JTextField(10);
private JTextField jtf_ClientPort = new JTextField(10);

private JButton jbt_Set= new JButton("设置");

private JTextArea jta_ClientShow = new JTextArea();
private JTextArea jta_ClientInput = new JTextArea();

private JButton jbt_Send= new JButton("发送");
private JButton jbt_Exit= new JButton("退出");

public UDPClient(){
JPanel jplClient11 = new JPanel();
jplClient11.setLayout(new GridLayout(3,2));
jplClient11.add(new JLabel("客户端端口:"));
jplClient11.add(jtf_ClientPort);
jplClient11.add(new JLabel("服务器地址:"));
jplClient11.add(jtf_ServerIP);
jplClient11.add(new JLabel("服务器端口:"));
jplClient11.add(jtf_ServerPort);

JPanel jplClient10= new JPanel();
jplClient10.add(jplClient11);
jplClient10.add(jbt_Set);
JPanel jplClient21 = new JPanel();
jplClient21.add(jbt_Send);
jplClient21.add(jbt_Exit);
JPanel jplClient31 = new JPanel();
jplClient31.setLayout(new GridLayout(2,1));
jplClient31.add(new JScrollPane(jta_ClientShow));
jplClient31.add(new JScrollPane(jta_ClientInput));

add(jplClient10,BorderLayout.NORTH);
add(jplClient31,BorderLayout.CENTER);
add(jplClient21,BorderLayout.SOUTH);

// 设置按钮触发事件
jbt_Set.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
client = new UDPClientBean(); //创建UDPClientBean对象
int cliPort = Integer.parseInt(jtf_ClientPort.getText());
//将客户机端口从jtf_ServerPort文本域中取出
client.setClientPort(cliPort); //将取出的cliPort给client对象的ClientPort成员变量
String serIP = jtf_ServerIP.getText(); // 将服务器IP从jtf_ServerIP文本域中取出
int serPort = Integer.parseInt(jtf_ServerPort.getText()); //将服务器端口从jtf_ServerPort文本域中取出
client.setdSocket(new DatagramSocket(client.getClientPort(),client.getClientIP())); // client对象调用setdSocket()函数,创建新Socket对象(此时客户机端口号为设定的端口号)
client.setServerIP(InetAddress.getByName(serIP));
//将取出的serIP给client对象的ServerIP成员变量
client.setServerPort(serPort); //将取出的serPort给client对象的ServerPort成员变量
jta_ClientShow.setText("将信息发送到IP为 "+jtf_ServerIP.getText()+" 端口为 "+jtf_ServerPort.getText()+" 的服务器上。\n"); // 将信息发送的对象的服务器的信息显示在jta_ClientShow区域中
} catch (SocketException e2) {
e2.printStackTrace();
} catch (UnknownHostException e1) {
e1.printStackTrace();
}catch (Exception e1) {
e1.printStackTrace();
}
}
});
// 发送按钮触发事件
jbt_Send.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
client.setContent("");
content = jta_ClientInput.getText(); //取jta_ClientInput文本区域中要发送的信息
client.setContent(content); //将取出的信息给client对对象的content成员变量
jta_ClientShow.setText(jta_ClientShow.getText()+"客户机发送:"+content+"\n"); // 将要发送的信息显示在jta_ClientShow区域框中
jta_ClientInput.setText(null); //将jta_ClientInput文本区域置空
String receive_str = null;
try {
client.sendToServer(); // client对象调用信息发送函数

} catch (IOException e1) {
jta_ClientShow.setText(jta_ClientShow.getText()+"数据发送失败\n");
e1.printStackTrace();
}
try {
receive_str = client.receiveFromServer(); // client对象调用信息接收函数,并将结果返回给receive_str变量
jta_ClientShow.setText(jta_ClientShow.getText()+receive_str+"\n");
// 将收到的信息显示在jta_ClientShow区域框中
} catch (IOException e1) {
jta_ClientShow.setText(jta_ClientShow.getText()+"数据接收失败\n");
e1.printStackTrace();
}
}
});

// 退出按钮触发事件
jbt_Exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
client.getdSocket().close();
System.exit(0);
}
});
}
}

截图:



现在就是出现点“发送”按钮没有反应的情况,代码貌似很长,其实思想很简单,求大神们耐心看完……
...全文
284 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
业余草 2014-07-01
  • 打赏
  • 举报
回复
1.确定是否触发了发送按钮,如果没有触发,则事件有问题。 2.触发了事件,检查是否发送了消息,如果没有发送消息,则可能是发送消息不正确导致的。 3.如果发送了消息,那可能就是接受端有问题,那就检查检查接收数据是否有不正确的地方导致的。 可能通过抓包,看看是否发送了。当然也有可能是乱码导致的。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧