我建立了两个客户端和一个服务端,一个客户端发消息给服务器,然后服务器转发给另一个客户端。问题是这样的,客户端1发了一个消息1给服务器然后转发给客户端2,然后这时候要是客户端2要给客户端1发个消息2的话,客户端1却是收到刚刚发出去的消息1,客户端2再发消息的时候就正常了,消息2不知道哪里去了,调试的时候客户端2发的消息2是有传送到服务器的,可是服务器再发出去的时候就变了
服务器程序:
import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;
import java.sql.*;
public class UDPServerService {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws SQLException {
// TODO code application logic here
// if(args.length<1)
// {
// System.out.println("请输入用于mail服务的本地端口号");
// System.exit(0);
// }
int i=8000;
// String s=Integer.toString(i);
UDPServerThread myUDPServer=new UDPServerThread(8000);//创建邮件服务器监听线程
myUDPServer.init();
Thread th=new Thread(myUDPServer);
th.start();
}
}
class UDPServerThread extends Frame implements Runnable
{
private DatagramSocket UDPServerSocket=null,UDPServerSocket1=null;
PreparedStatement ps;
TextArea ta=new TextArea(10,50);
JButton close;
Connection con;
Statement stmt;
ResultSet rs;
String sql;
int flag=0;
int ports;
void init(){
close=new JButton("close");
setTitle("服务监听器");
setSize(400,300);
setLayout(new FlowLayout());
add("center",ta);
add(close);
close.addActionListener(new Close());
setVisible(true);
}
UDPServerThread(int Port){
ports=Port;
try{
UDPServerSocket=new DatagramSocket(Port);
UDPServerSocket1=new DatagramSocket(Port+1);
ta.append("邮件服务监听器在端口"+UDPServerSocket.getLocalPort()+"\n");
}catch(Exception e){
System.err.println(e);
}
}
public void run(){
if(UDPServerSocket==null)
return;
while(true){
try{
byte[] dataBuf=new byte[512];
DatagramPacket ServerPacket;
InetAddress remoteHost;
int remotePort;
String datagram,s;
ServerPacket =new DatagramPacket(dataBuf,512);
UDPServerSocket.receive(ServerPacket);//接受
remoteHost=ServerPacket.getAddress();
remotePort=ServerPacket.getPort();
datagram=new String(ServerPacket.getData());
String sql="SELECT * FROM biao1";
try{
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
con=DriverManager.getConnection("jdbc:ucanaccess://D:\\access\\db1.mdb","","");
stmt=con.createStatement();
rs=stmt.executeQuery(sql);
}catch(Exception e1){
e1.printStackTrace();
}
if(datagram.contains("#dl#")){
while(rs.next()){ //验证帐号密码是否正确
if((datagram.indexOf(rs.getString("username"))!=-1)&&(datagram.indexOf(rs.getString("password")))!=-1){
String pass="connect";
dataBuf=pass.getBytes();
ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
UDPServerSocket.send(ServerPacket);
ta.append("用户"+remoteHost+"已登录"+'\n');
flag=1;
sql="UPDATE biao1 SET connection=? WHERE username=?";
ps=con.prepareStatement(sql);
ps.setInt(1,1);
ps.setString(2, rs.getString("username"));
ps.executeUpdate(); //表1中设置该用户为在线状态
sql="UPDATE biao1 SET remoteHost=? WHERE username=?";
ps=con.prepareStatement(sql);
ps.setString(1,remoteHost.toString());
ps.setString(2, rs.getString("username"));
ps.executeUpdate();
sql="UPDATE biao1 SET remotePort=? WHERE username=?";
ps=con.prepareStatement(sql);
ps.setInt(1, remotePort);
ps.setString(2, rs.getString("username"));
ps.executeUpdate(); //修改表中用户的登录地址,登录端口
con.commit();
con.close();
}
}
if(flag==0){
String lost="lost";
dataBuf=lost.getBytes();
ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
UDPServerSocket.send(ServerPacket);
}
}
else{
sql="SELECT * FROM biao1";
ResultSet rt;
rt=stmt.executeQuery(sql);
int port=0;
//ta.append('\n'+"收到如下主机发来的邮件"+remoteHost.getHostName()+":\n"+datagram);
while(rt.next()){
if(datagram.indexOf(rt.getString("username"))!=-1){
if(rt.getString("connection").indexOf("1")!=-1){
InetAddress remoteHost1=InetAddress.getByName(rt.getString("remoteHost").substring(1));
int remotePort1=rt.getInt("remotePort");
port=remotePort1+1;
dataBuf=new byte[512];
dataBuf=datagram.getBytes();
System.out.print(datagram);
ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost1,port);
UDPServerSocket1.send(ServerPacket);
}
else{
datagram=new String("unconnect.");
dataBuf=new byte[512];
//remoteHost=InetAddress.getByName("QH-20150828KDPO");
dataBuf=datagram.getBytes();
ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
UDPServerSocket.send(ServerPacket);
}
}
}
}
}catch(Exception e){
System.err.println(e);
}
}
}
protected void finalize(){
if(UDPServerSocket!=null){
UDPServerSocket.close();
UDPServerSocket=null;
ta.append("关闭服务器端的数据报连接!");
}
}
}
class Close implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
客户端程序:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import static java.lang.Thread.sleep;
import java.util.Scanner;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class UDPClientService1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args){
// TODO code application logic here
Dl d=new Dl(args);
}
}
class UDPClientService extends Frame implements ActionListener,Runnable{
DatagramSocket UDPClientSocket;
DatagramPacket ClientPacket;
InetAddress remoteHost;
int remotePort;
byte[] dataBuf;
String datagram;
private String send="";
String args[]=new String[3];
Scanner in;
TextArea ta_receive=new TextArea(10,60),ta_send=new TextArea(5,60);
JButton ok=new JButton("ok"),close =new JButton("close"),test=new JButton("test");
JPanel p3=new JPanel(),p1=new JPanel(),p2=new JPanel();
void Init_Frame(){
setTitle("服务器端口1");
setSize(500,450);
setLayout(new BorderLayout());
ta_receive.setEditable(false);
ta_send.requestFocus();
add(p1,BorderLayout.NORTH);
add(p2,BorderLayout.CENTER);
add(p3,BorderLayout.SOUTH);
p1.add(ta_receive);
p2.add(ta_send);
p3.add(ok);
p3.add(close);
p3.add(test);
ok.addActionListener(this);
close.addActionListener(this);
test.addActionListener(this);
setVisible(true);
}
void Init(String args[]){
this.args=args;
if(args.length<3){
ta_receive.append("请输入本地端口号,远程服务器主机号及端口名");
System.exit(0);
}
try{
UDPClientSocket =new DatagramSocket(Integer.valueOf(args[0])+1);
remoteHost=InetAddress.getByName(args[1]);
remotePort=Integer.parseInt(args[2]);
}catch(Exception e){
System.err.println(e);
}
}
public void run(){
while(true){
try {
dataBuf=new byte[512];
ClientPacket=new DatagramPacket(dataBuf,512);
UDPClientSocket.receive(ClientPacket);//接受
datagram=new String(ClientPacket.getData());
System.out.print(datagram);
ta_receive.append('\n'+"Server:"+'\n');
ta_receive.append(" "+datagram+'\n');
} catch (IOException ex) {
Logger.getLogger(UDPClientService.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==ok){
try{
in=new Scanner(ta_send.getText());
//int port=Integer.valueOf(args[0])+2;
ta_receive.append('\n'+"Client:"+'\n'+""+ta_send.getText()+'\n'+'\n');
// UDPClientSocket1 =new DatagramSocket(port);
datagram=send+in.nextLine();
dataBuf=datagram.getBytes();
ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
UDPClientSocket.send(ClientPacket);//发送
ta_send.setText("");
}catch(IOException e1){
System.err.println(e1);
}
}
else if(e.getSource()==close){
dispose();
System.exit(0);
}
else if(e.getSource()==test){
send="lijing";
}
}
}
class Dl extends Frame implements ActionListener{
JTextField t1=new JTextField(10),t2=new JTextField(10);
JButton ok=new JButton("ok"),close=new JButton("close");
JLabel l=new JLabel("tips"),username1=new JLabel("username"),password1=new JLabel("password");
String args[]=new String[3];
Panel p1=new Panel(),p2=new Panel(),p3=new Panel(),p4=new Panel();
private String name,password,s;
DatagramSocket UDPClientSocket;
DatagramPacket ClientPacket;
InetAddress remoteHost;
int remotePort;
byte[] dataBuf;
String datagram;
String flags="#dl#";
Dl(String args[]){
this.args=args;
try{
UDPClientSocket =new DatagramSocket(Integer.parseInt(args[0]));
remoteHost=InetAddress.getByName(args[1]);
remotePort=Integer.parseInt(args[2]);
}catch(Exception e){
System.err.println(e);
}
setLayout(new BorderLayout());
setSize(200,150);
p1.add(username1);
p1.add(t1);
p1.add(password1);
p1.add(t2);
p1.add(ok);
p1.add(close);
p2.add(l);
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH);
ok.addActionListener(this);
close.addActionListener(this);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==ok){
try{
name=t1.getText();
password=t2.getText();
s=flags+name+password;
dataBuf=s.getBytes();
ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
UDPClientSocket.send(ClientPacket);//发送
dataBuf=new byte[512];
ClientPacket=new DatagramPacket(dataBuf,512);
UDPClientSocket.receive(ClientPacket);//接受
datagram=new String(ClientPacket.getData());
if(datagram.contains("connect")){
UDPClientService ucs=new UDPClientService();
ucs.Init_Frame();
ucs.Init(args);
setVisible(false);
Thread th=new Thread(ucs);
th.start();
}
else{
l.setText("error!!");
}
}catch(IOException e1){
System.err.println(e1);
}
}
else if(e.getSource()==close){
dispose();
System.exit(0);
}
}
}