java程序怎么实现UDP多线程通信 用split方法分不开两段啊 以下程序有错的地方希望纠错 谢谢!! 50
UDPServer//服务端代码packagecom.udp;importjava.net.*;importjava.util.*;importjava.io.*;pub...
UDPServer//服务端代码
package com.udp;
import java.net.*;
import java.util.*;
import java.io.*;
public class Server {
/**
* @param args
*/
public static Map<String,DatagramSocket> list=new HashMap<String, DatagramSocket>();
public static void main(String[] args) {
try {
DatagramSocket Servers=new DatagramSocket(15600);//Server端口
new sfz(Servers).start();//线程
} catch (SocketException e) {
System.out.println("服务器启动失败!");
}
}
}
class sfz extends Thread{
static DatagramSocket ds;
static DatagramPacket dp;
static byte[] a;
static InetAddress dz;
static int port;
public sfz(DatagramSocket ds){
this.ds=ds;
}
public void run(){
while(true){
try {
a=new byte[8192];
dp=new DatagramPacket(a,a.length);
ds.receive(dp);
a=dp.getData();
dz=dp.getAddress();//获取用户地址
port=dp.getPort();//获取用户端口
} catch (IOException e1) {
System.out.println("接收客户信息失败!");
}
try{
String nr=new String(a,0,a.length).trim();
if(nr.startsWith("ZC:")){
System.out.println("登录名:"+ nr);
String name =nr.substring(3);
if(Server.list.containsKey(name)){
DatagramSocket ds2=Server.list.get(name);
if(ds2!=null){
a=new byte[8192];
a="该用户已在线!".getBytes();
dp=new DatagramPacket(a,a.length,ds2.getLocalAddress(),ds2.getLocalPort());//不知如何有没有错。
ds.send(dp);
ds.close();
}
}
Server.list.put(name, ds);
a=new byte[8192];
a="OK".getBytes();
dp=new DatagramPacket(a,a.length,dz,port);
ds.send(dp);
}else{
System.out.println(nr);
String[] zf=nr.split("_");
System.out.println("内容:"+zf[0]);
System.out.println("转发给:"+zf[1]);
if(zf[1].equals("0")){
Set<String> set=Server.list.keySet();
for(String s:set){
DatagramSocket ds3=Server.list.get(s);
if(ds3.equals(this.ds)){
continue;
}else{
a=new byte[8192];
a=zf[0].getBytes();
dp=new DatagramPacket(a,a.length,ds3.getLocalAddress(),ds3.getLocalPort());
ds.send(dp);
}
}
}else{
DatagramSocket ds4=Server.list.get(zf[1]);
System.out.println(ds4);
if(ds4==null){
a=new byte[8192];
a="没有该用户".getBytes();
dp=new DatagramPacket(a,a.length,dz,port);
ds.send(dp);
}else{
a=new byte[8192];
a=zf[0].getBytes();
dp=new DatagramPacket(a,a.length,ds4.getLocalAddress(),ds4.getLocalPort());
ds.send(dp);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} 展开
package com.udp;
import java.net.*;
import java.util.*;
import java.io.*;
public class Server {
/**
* @param args
*/
public static Map<String,DatagramSocket> list=new HashMap<String, DatagramSocket>();
public static void main(String[] args) {
try {
DatagramSocket Servers=new DatagramSocket(15600);//Server端口
new sfz(Servers).start();//线程
} catch (SocketException e) {
System.out.println("服务器启动失败!");
}
}
}
class sfz extends Thread{
static DatagramSocket ds;
static DatagramPacket dp;
static byte[] a;
static InetAddress dz;
static int port;
public sfz(DatagramSocket ds){
this.ds=ds;
}
public void run(){
while(true){
try {
a=new byte[8192];
dp=new DatagramPacket(a,a.length);
ds.receive(dp);
a=dp.getData();
dz=dp.getAddress();//获取用户地址
port=dp.getPort();//获取用户端口
} catch (IOException e1) {
System.out.println("接收客户信息失败!");
}
try{
String nr=new String(a,0,a.length).trim();
if(nr.startsWith("ZC:")){
System.out.println("登录名:"+ nr);
String name =nr.substring(3);
if(Server.list.containsKey(name)){
DatagramSocket ds2=Server.list.get(name);
if(ds2!=null){
a=new byte[8192];
a="该用户已在线!".getBytes();
dp=new DatagramPacket(a,a.length,ds2.getLocalAddress(),ds2.getLocalPort());//不知如何有没有错。
ds.send(dp);
ds.close();
}
}
Server.list.put(name, ds);
a=new byte[8192];
a="OK".getBytes();
dp=new DatagramPacket(a,a.length,dz,port);
ds.send(dp);
}else{
System.out.println(nr);
String[] zf=nr.split("_");
System.out.println("内容:"+zf[0]);
System.out.println("转发给:"+zf[1]);
if(zf[1].equals("0")){
Set<String> set=Server.list.keySet();
for(String s:set){
DatagramSocket ds3=Server.list.get(s);
if(ds3.equals(this.ds)){
continue;
}else{
a=new byte[8192];
a=zf[0].getBytes();
dp=new DatagramPacket(a,a.length,ds3.getLocalAddress(),ds3.getLocalPort());
ds.send(dp);
}
}
}else{
DatagramSocket ds4=Server.list.get(zf[1]);
System.out.println(ds4);
if(ds4==null){
a=new byte[8192];
a="没有该用户".getBytes();
dp=new DatagramPacket(a,a.length,dz,port);
ds.send(dp);
}else{
a=new byte[8192];
a=zf[0].getBytes();
dp=new DatagramPacket(a,a.length,ds4.getLocalAddress(),ds4.getLocalPort());
ds.send(dp);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} 展开
展开全部
a=new byte[8192];
a="没有该用户".getBytes();
首先这句的写法就有大问题了……
你把a先指向了一个8192长度的byte数组 然后马上又把a指向xxxx.getBytes(),也就是说第一句没有任何用处
然后你具体的代码 我已经不知道你想做什么了~~~如果你只是想用DatagrameSocket来实现数据传输其实很简单的……可以参见orelly的《java网络编程》里面的例子 我就不贴了
然后把例子改成多线程的就行了……
a="没有该用户".getBytes();
首先这句的写法就有大问题了……
你把a先指向了一个8192长度的byte数组 然后马上又把a指向xxxx.getBytes(),也就是说第一句没有任何用处
然后你具体的代码 我已经不知道你想做什么了~~~如果你只是想用DatagrameSocket来实现数据传输其实很简单的……可以参见orelly的《java网络编程》里面的例子 我就不贴了
然后把例子改成多线程的就行了……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询