Java如何实现两个Client也能进行通信 本帖最后由 Computer001 于 2011-03-22 13:59:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两个Client之间的通信,要么用Server中转,要么两边都实现Server。连续发送和连续接收,多起个线程扫输入流即可以实现。网络这块看过些代码,自己也没动过手……一下,等大虾。 连续发送就是发完一句再发一句,为什么要等服务器应答,你的代码写成 getMsg(s); sendMsg(s);当然是收一条,发一条了。 必须使用非阻塞通讯 ,去看看 java.nio 这个包的内容把。jdk的javadoc中有说明的。 不能实现两个Client之间的通信,如何实现?无法实现,必须有 Server再就是目前的通信是Server发送一句,Client接收再发一句,Server和Client都不能连续发送和连续接收?因为你用的是同步方式,Server 在接收到 Client 连接时,使用线程另外去处理就不会有这种情况了。如何实现可以可重复的发送和接收呢?那需要自己定义一个协议,在消息前加 2 个字节(short 数值,或者 4 个字节的 int)用于标识后面的消息有多长。首先读取这 2 个字节,这样的话就知道消息有多少了。就不会把连续发过来的消息都当作是一条消息了。 通过SERVER中转,Client用While(true)一直等待接收服务器中转的信息即可。 用UDP吧,可以任意两个CLIENT相互通信,只要知道IP和端口 通过使用线程的方法把前1 3 4 的问题解决了。现在就是不能 两个Client进行通信了.代码如下:import java.io.*;import java.net.*;class TServer extends Thread{ Socket s; public TServer(Socket s){ this.s = s; } public void run() { //new SSend(s).start(); new SResever(s).start(); } public static void main(String [] args) throws Exception{ ServerSocket server = new ServerSocket(8888); while(true) { Socket s = server.accept(); TServer ts = new TServer(s); ts.start(); } }}class SSend extends Thread { Socket s; public SSend(Socket s){ this.s = s; } public void run(){ while(true) { String flag = sendMsg(s); if(flag.equals("quit")){ System.out.println("会话结束!"); new SResever(s).start(); break; }else if(flag.equals("exit")){ System.exit(-1); } } } public static String sendMsg(Socket s){ System.out.println("请输入发送给客户端的信息:\n"); String inputMsg=null; BufferedReader br=null; OutputStream os =null; try{ br = new BufferedReader(new InputStreamReader(System.in)); inputMsg = br.readLine(); }catch(Exception e){ e.printStackTrace(); } try{ os = s.getOutputStream(); os.write(inputMsg.getBytes()); }catch(Exception e){ e.printStackTrace(); } return inputMsg; }}class SResever extends Thread{ Socket s; public SResever(Socket s){ this.s = s; } public void run(){ while(true) { String flag = getMsg(s); if(flag.equals("quit")){ System.out.println("会话结束!"); new SSend(s).start(); break; }else if(flag.equals("exit")){ System.exit(-1); } } } public static String getMsg(Socket s){ String Ip = s.getInetAddress().toString(); System.out.println("正在获取客户端的信息,请待........\n"); InputStream is =null; String reMsg =null; try{ is = s.getInputStream(); byte [] buf = new byte [1024]; int len = is.read(buf); reMsg = new String(buf,0,len); System.out.println(Ip+":" + reMsg); }catch(Exception e){ e.printStackTrace(); } return reMsg; }}import java.io.*;import java.net.*;import java.util.*;class TClient { public static void main(String [] args) throws Exception{ Socket s = new Socket("127.0.0.1",8888); new CSend(s).start(); }}class CSend extends Thread { Socket s; public CSend(Socket s){ this.s = s; } public void run(){ while(true) { String flag = sendMsg(s); if(flag.equals("quit")){ System.out.println("会话结束!"); new SResever(s).start(); break; }else if(flag.equals("exit")){ System.exit(-1); } } } public static String sendMsg(Socket s){ System.out.println("请输入发送给客户端的信息:\n"); String inputMsg=null; BufferedReader br=null; OutputStream os =null; try{ br = new BufferedReader(new InputStreamReader(System.in)); inputMsg = br.readLine(); }catch(Exception e){ e.printStackTrace(); } try{ os = s.getOutputStream(); os.write(inputMsg.getBytes()); }catch(Exception e){ e.printStackTrace(); } return inputMsg; }}class SResever extends Thread{ Socket s; public SResever(Socket s){ this.s = s; } public void run(){ while(true) { String flag = getMsg(s); if(flag.equals("quit")){ System.out.println("会话结束!"); new CSend(s).start(); break; }else if(flag.equals("exit")){ System.exit(-1); } } } public static String getMsg(Socket s){ String Ip = s.getInetAddress().toString(); System.out.println("正在获取客户端的信息,请待........\n"); InputStream is =null; String reMsg =null; try{ is = s.getInputStream(); byte [] buf = new byte [1024]; int len = is.read(buf); reMsg = new String(buf,0,len); System.out.println(Ip+":" + reMsg); }catch(Exception e){ e.printStackTrace(); } return reMsg; }} 把操作系统 进程通信 那块钻研一下 学习一下思想 再结合java通讯知识 注意结构一定要清晰... 正如楼上所说 用Servert做中转 收一条后在发一条 一直... 两个客户端无法直接通过可以使用 udp协议 这个不就是 P2P 吗?JXTA 不就是做整个的 按钮被按下去就不再起来了 java 对一个类变量加锁\解锁 fckeditor 没得支持JSP的版本么?? 请问如何在JAVA中编程修改IE的安全级别?小第跪求答案了!!! SUN的JADE混淆器似乎很键壮 接着请教applet运行在MS的1.1的JVM上的问题,--(如何在编译或运行时查错) 如何用程序设置某一行被选中? 求JBUILDER7注册机!马上给分! 关于 Jet!? 蘑菇街面试题,赛马网用java写,经常说输出格式出错 eclipse里面取消上次操作的快捷键是什么 三步学会Java Socket编程(1)
连续发送和连续接收,多起个线程扫输入流即可以实现。网络这块看过些代码,自己也没动过手……
一下,等大虾。
sendMsg(s);当然是收一条,发一条了。
那需要自己定义一个协议,在消息前加 2 个字节(short 数值,或者 4 个字节的 int)用于标识后面的消息有多长。首先读取这 2 个字节,这样的话就知道消息有多少了。就不会把连续发过来的消息都当作是一条消息了。
import java.io.*;
import java.net.*;
class TServer extends Thread{
Socket s;
public TServer(Socket s){
this.s = s;
}
public void run() {
//new SSend(s).start();
new SResever(s).start();
}
public static void main(String [] args) throws Exception{
ServerSocket server = new ServerSocket(8888);
while(true)
{
Socket s = server.accept();
TServer ts = new TServer(s);
ts.start();
}
}
}
class SSend extends Thread {
Socket s;
public SSend(Socket s){
this.s = s;
}
public void run(){
while(true)
{
String flag = sendMsg(s);
if(flag.equals("quit")){
System.out.println("会话结束!");
new SResever(s).start();
break;
}else if(flag.equals("exit")){
System.exit(-1);
}
}
}
public static String sendMsg(Socket s){
System.out.println("请输入发送给客户端的信息:\n");
String inputMsg=null;
BufferedReader br=null;
OutputStream os =null;
try{
br = new BufferedReader(new InputStreamReader(System.in));
inputMsg = br.readLine();
}catch(Exception e){
e.printStackTrace();
}
try{
os = s.getOutputStream();
os.write(inputMsg.getBytes());
}catch(Exception e){
e.printStackTrace();
}
return inputMsg;
}
}class SResever extends Thread{
Socket s;
public SResever(Socket s){
this.s = s;
}
public void run(){
while(true)
{
String flag = getMsg(s);
if(flag.equals("quit")){
System.out.println("会话结束!");
new SSend(s).start();
break;
}else if(flag.equals("exit")){
System.exit(-1);
}
}
}
public static String getMsg(Socket s){
String Ip = s.getInetAddress().toString();
System.out.println("正在获取客户端的信息,请待........\n");
InputStream is =null;
String reMsg =null;
try{
is = s.getInputStream();
byte [] buf = new byte [1024];
int len = is.read(buf);
reMsg = new String(buf,0,len);
System.out.println(Ip+":" + reMsg);
}catch(Exception e){
e.printStackTrace();
}
return reMsg;
}
}
import java.io.*;
import java.net.*;
import java.util.*;
class TClient {
public static void main(String [] args) throws Exception{
Socket s = new Socket("127.0.0.1",8888);
new CSend(s).start();
}
}class CSend extends Thread {
Socket s;
public CSend(Socket s){
this.s = s;
}
public void run(){
while(true)
{
String flag = sendMsg(s);
if(flag.equals("quit")){
System.out.println("会话结束!");
new SResever(s).start();
break;
}else if(flag.equals("exit")){
System.exit(-1);
}
}
}
public static String sendMsg(Socket s){
System.out.println("请输入发送给客户端的信息:\n");
String inputMsg=null;
BufferedReader br=null;
OutputStream os =null;
try{
br = new BufferedReader(new InputStreamReader(System.in));
inputMsg = br.readLine();
}catch(Exception e){
e.printStackTrace();
}
try{
os = s.getOutputStream();
os.write(inputMsg.getBytes());
}catch(Exception e){
e.printStackTrace();
}
return inputMsg;
}
}class SResever extends Thread{
Socket s;
public SResever(Socket s){
this.s = s;
}
public void run(){
while(true)
{
String flag = getMsg(s);
if(flag.equals("quit")){
System.out.println("会话结束!");
new CSend(s).start();
break;
}else if(flag.equals("exit")){
System.exit(-1);
}
}
}
public static String getMsg(Socket s){
String Ip = s.getInetAddress().toString();
System.out.println("正在获取客户端的信息,请待........\n");
InputStream is =null;
String reMsg =null;
try{
is = s.getInputStream();
byte [] buf = new byte [1024];
int len = is.read(buf);
reMsg = new String(buf,0,len);
System.out.println(Ip+":" + reMsg);
}catch(Exception e){
e.printStackTrace();
}
return reMsg;
}
}
收一条后在发一条
一直...
可以使用 udp协议
JXTA 不就是做整个的