写两个客户端,每个客户端都有发送和接受,但不知道要怎样实现?package com.crazy;
import java.net.*;
import java.io.*;public class CrazyServer {
public static void main(String[] args) {
ThreadClient tc = new ThreadClient();
ThreadServer ts = new ThreadServer();
tc.runClient();
ts.runServer();
Thread th1 = new Thread(tc);
Thread th2 = new Thread(ts);
th1.start();
th2.start();
}
}class ThreadServer implements Runnable {
DatagramPacket dp = null;
DatagramSocket ds = null;
byte[] buf = null;
public void runServer() {
buf = new byte[1000];
dp = new DatagramPacket(buf,buf.length);
try {
ds = new DatagramSocket(6060);
} catch (SocketException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void run() {
while(true) {
try {
ds.receive(dp);
System.out.println(new String(buf,0,dp.getLength()));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} }
} class ThreadClient implements Runnable {
byte[] bt = null;
DatagramPacket dp =null;
DatagramSocket ds = null;
public void runClient() {
bt = (new String("你好")).getBytes();
try {
dp = new DatagramPacket(bt,bt.length,new InetSocketAddress("127.0.0.1",9090));
// ds = new DatagramSocket(6060);
} catch (SocketException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void run() {
try {
ds.send(dp);
ds.close();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
} 高手指教..
import java.net.*;
import java.io.*;public class CrazyServer {
public static void main(String[] args) {
ThreadClient tc = new ThreadClient();
ThreadServer ts = new ThreadServer();
tc.runClient();
ts.runServer();
Thread th1 = new Thread(tc);
Thread th2 = new Thread(ts);
th1.start();
th2.start();
}
}class ThreadServer implements Runnable {
DatagramPacket dp = null;
DatagramSocket ds = null;
byte[] buf = null;
public void runServer() {
buf = new byte[1000];
dp = new DatagramPacket(buf,buf.length);
try {
ds = new DatagramSocket(6060);
} catch (SocketException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void run() {
while(true) {
try {
ds.receive(dp);
System.out.println(new String(buf,0,dp.getLength()));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} }
} class ThreadClient implements Runnable {
byte[] bt = null;
DatagramPacket dp =null;
DatagramSocket ds = null;
public void runClient() {
bt = (new String("你好")).getBytes();
try {
dp = new DatagramPacket(bt,bt.length,new InetSocketAddress("127.0.0.1",9090));
// ds = new DatagramSocket(6060);
} catch (SocketException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void run() {
try {
ds.send(dp);
ds.close();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
} 高手指教..
贴一个自己写的基于UDP的聊天室,供LZ参考下:
package socket;import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.net.UnknownHostException;public class Chat {
Frame f = new Frame("我的聊天室"); TextField tfIP = new TextField(15); List lst = new List(6); DatagramSocket ds; public void init() {
f.setSize(300, 700);
f.setLocation(700, 20); Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add("West", tfIP);
TextField tfData = new TextField(20);
p.add("East", tfData);
f.add(lst);
f.add("South", p);
f.setVisible(true);
f.setResizable(false);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
tfData.addActionListener(new ActionListener() {
DatagramPacket dp; public void actionPerformed(ActionEvent e) {
byte[] buf;
buf = e.getActionCommand().getBytes();
try {
dp = new DatagramPacket(buf,
buf.length,
java.net.InetAddress
.getByName(tfIP
.getText()),
3000);
} catch (UnknownHostException e1) {
e1.printStackTrace();
}
try {
ds.send(dp);
} catch (IOException e1) {
e1.printStackTrace();
}
((TextField) e.getSource()).setText("");
}
});
} public Chat() {
try {
ds = new DatagramSocket(3000);
} catch (SocketException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
public void run() {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,
1024);
while (true) {
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
lst.add(new String(buf, 0, dp
.getLength())
+ " from "
+ dp.getAddress()
+ " : " + dp.getPort()); }
}
}).start(); } public static void main(String[] args) {
Chat chat = new Chat();
chat.init();
}
}
明白了问题,就要解决问题了。楼主到底想要做什么呢?
是两个客户端之间的一对一通信(不需要借助UDPServer)?还是在UDPServer帮助下进行一对一?还是。?
我以以肯定地说,UDP的一对一(楼主的一对一到底是什么含义呢?)是要进行特别考虑与设计的。不是开两个端口就了事的。
1)只要写一个UDP程序就行了(不必要通常大家本能就想到的:一个服务器,一个客户机。)。该程序打开一个UDP端口号如:6666;创建两个线程:一个只管收,另一个只管发。
2)两个用户,在各自的机器上运行这同一个UDP程序,就可以工作了。
3)UDP不是一对一的,本质上是一对多的。即:任何第三个用户只要知道某一个用户的IP与端口号,就能发UDP包给该用户。这是你阻止不了的(即:你的只能有两个用户互相通信!!,连接型的UDP也不行。)。因此,你只能在程序中通过判发送方的IP或你认为的其它用户身份认证,来丢弃你不需要的第三个用户的UDP包。以上仅供你参考