UDP通信代码如下 :
客户端
public class ClientMsg extends Thread {
private static DatagramSocket datagramsocket ;
private static JTextArea jtextarea ;
private static Socket socket ;
private static ServerSocket server ;
public ClientMsg ( JTextArea textArea) {
try {
// server = new ServerSocket(2022) ;
datagramsocket = new DatagramSocket();
}catch (IOException e) {
System.out.println( "访问出错,端口已被占用,请更换端口号");
}
ClientMsg.jtextarea = textArea ;
}
/*向服务器注册一下*/
public void reg ( String ip , int port ) {
send (ip , port , "reguser") ;
if ( this.getState() == State.NEW ) {
this.start();
}
}
//向服务器发送数据
public void send ( String ip , int port , String msg){
byte[] b = msg.getBytes() ;
try {
DatagramPacket datagrampacket = new DatagramPacket( b , b.length , InetAddress.getByName(ip) , port);
datagramsocket.send(datagrampacket);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch ( IOException i ) {
i.printStackTrace();
}
}
//接送服务器反馈回来的数据 ,用线程循环接送
public void run () {
try {
byte[] b = new byte[1024*3] ;
DatagramPacket datagrampacket = new DatagramPacket ( b , b.length ) ;
datagramsocket.receive(datagrampacket);
String s = new String ( datagrampacket.getData() , 0 , datagrampacket.getLength() ) ;
String text = jtextarea.getText() ;
jtextarea.setText(datagrampacket.getAddress().getHostAddress() + ":" + s + "\n" + text );
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main ( String[] ary ) {
}
}
服务端
public class UDPMSGserver extends Thread implements Serializable{
public UDPMSGserver (DatagramPacket datagrampacket ) {
this.datagrampacket = datagrampacket ;
}
private DatagramPacket datagrampacket ;
private static DatagramSocket datagramsocket ;
private static ServerSocket server ;
private static Socket socket ;
public static String str ;
/* 登记用户的 IP 和 端口 */
private static HashSet< String > hashSet = new HashSet< String >() ;
//接送客户端发送过来的数据 , 循环接收
public static void operServer () throws IOException{
try {
datagramsocket = new DatagramSocket (666) ;
while ( true ) {
try {
byte[] b = new byte[1024*3 ] ;
DatagramPacket datagrampacket1 = new DatagramPacket( b , b.length ) ;
datagramsocket.receive(datagrampacket1);
new UDPMSGserver(datagrampacket1).start(); ;
}catch ( IOException i ) {
System.out.println( " 接收数据时发生错误 " ) ;
}
}
}catch ( IOException s ) {
s.printStackTrace();
}
}
public void run() {
/* 将客户端数据转换成字符串 */
String clientStr = new String ( datagrampacket.getData() , 0 , datagrampacket.getLength() ) ;
/*注册接收端*/
if ( clientStr.startsWith("reguser")) {
String ip = datagrampacket.getAddress().getHostAddress() ;
int port = datagrampacket.getPort() ;
hashSet.add( ip + "," + port ) ;
} else {
//返回数据给客户端
for ( String string : hashSet) {
String ip = string.split(",")[0] ;
int port = Integer.parseInt(string.split(",")[1]) ;
try {
DatagramPacket data = new DatagramPacket(datagrampacket.getData() , datagrampacket.getLength() , InetAddress.getByName(ip) , port ) ;
datagramsocket.send(data);
} catch ( UnknownHostException u ) {
System.out.println( "目标IP出现异常" );
}catch ( IOException I ) {
System.out.println("数据文件发生错误");
}
}
}
}
public static void main ( String[] ary ) {
try {
UDPMSGserver.operServer();
} catch (IOException e) {
e.printStackTrace();
}
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:个人意见: