这是我刚写的PP对话示例,没写窗体部份.想让Client用Server两线程同步进行,但刚开始还行,后来不知为什么冒似不同步了,奇怪,可能有许多错误,肯请帮我指点迷津。
//服务端+客户端程序部份
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.net.Socket;
//import java.lang.Object;
import java.io.InputStream;
import java.io.OutputStream;
//java.net.DatagramSocket;
//java.net.DatagramPacket;
//java.lang.Thread;//接收数据报
class OutputNetPhone{
private static int port1=0;
//String host1;
public synchronized static void sub(int port){
//host1=host;
port1=port;
DatagramSocket ds1=null;
try{
ds1=new DatagramSocket(port1);//用于接收数据的对像
System.out.println("打开了监听器....");
}
catch(SocketException e){
e.printStackTrace();
System.exit(-1);//无法获取应用商口,异常后正常退出
}
byte[] buf1=new byte[1024];//组装数据报流的数组
DatagramPacket dp1=new DatagramPacket(buf1,buf1.length);//此为接收数据报的实例
System.out.println("数据报接收器正常....");
System.out.println("连接中.....");
while(true){
DataInputStream dis1=new DataInputStream(new ByteArrayInputStream(buf1));
//要捕捉无法实现退出阻塞状态的异常
try{
ds1.receive(dp1);//在此是一段阻塞,直到收到数据报后将数据装入接收器dp1中
System.out.println("数据报成功接收....");
System.out.print("从网络获得:");
System.out.println(dis1.readLong());
System.out.println("连接中.....");
dis1.close();
}
catch(SocketException e){
e.printStackTrace();
continue;
}
catch(IOException e){
System.err.println("IO Error!"+e);
continue;
}
catch(Exception e){
e.printStackTrace();
continue;
}
/*try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}*/
}
}
}
//接收数据报线程类
class Server extends Thread{
public void run(){
OutputNetPhone.sub(20000);
}
}//发送数据报
class InputNetPhone{
private static int port2=0;
public synchronized static void sub(int port){
DatagramSocket ds2=null;
port2=port;
try{
ds2=new DatagramSocket();
System.out.println("服务器连接成功.....");
}
catch(SocketException e){
e.printStackTrace();
System.exit(-1);
}
BufferedReader breader1=new BufferedReader(new InputStreamReader(System.in));
long data=0;
System.out.println("连接中.....");
while(true){
ByteArrayOutputStream bytesOut=new ByteArrayOutputStream();//创建数据报字节流
DataOutputStream dos1=new DataOutputStream(bytesOut);
try{
data=Long.parseLong(breader1.readLine());
dos1.writeLong(data);
dos1.flush();
byte[] buffer=bytesOut.toByteArray();//将流组装成数组buffer[]以等发送数据报
DatagramPacket dp2=new DatagramPacket(buffer,buffer.length,new  InetSocketAddress("127.0.0.14",port2));
ds2.send(dp2);
System.out.println("数据报成功发送....");
System.out.println("向网络发送:"+Long.parseLong(breader1.readLine()));
System.out.println("连接中.....");
dos1.close();
bytesOut.close();
}
catch(SocketException e){
System.err.println("Socket error!"+e);
continue;
}
//捕捉流异常
catch(IOException e){
System.err.println("IO Error!"+e);
continue;
}
catch(Exception e){
e.printStackTrace();
continue;
}
/*try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}*/
}
}
}
//发送数据的线程类
class Client extends Thread{
public void run(){
InputNetPhone.sub(20000);
}
}public class QQServer extends JFrame{
public static void main(String[] args){
Server t1=new Server();
Client t2=new Client();
t1.start();
t2.start();
}

运行结果:
服务器连接成功...
打开了监听器....
连接中.....
数据报接收器正常.
连接中.....
4545
数据报成功发送...
数据报成功接收...
从网络获得:4545
连接中.....