这是我刚写的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 
连接中.....