package juyuwangip;
import java.io.*;
import java.net.*;
import java.util.*;
public class JuyuwangIP{
public static void main(String args[]){
new starts().starts();
}
}
class message extends Thread{//消息转发其他客户端机制
ArrayList<Socket> socket03 = new ArrayList<Socket>();
int i=0;
String ms;
message(String c1,ArrayList<Socket> h,int i){//传入值为“要转发的消息”“socket”“socket个数”
socket03=h; }
public void run(){ //转发具体执行
Socket mysocket = null;
DataOutputStream out = null;
for(int j=0;j<=i;j++)//循环得到socket转发
{
mysocket = socket03.get(j);
InetAddress ip = mysocket.getInetAddress();
String my = ip.toString();
String[] st = my.split("/");
my= st[1];//得到要转发至客户端的ip地址
int port = mysocket.getPort();//得到端口号
try{ //下面就是连接客户端发数据包了,总是连接失败
// mysocket.connect();
// mysocket = new Socket(ip,port);
System.out.println("客户的地址:2222");
out = new DataOutputStream(mysocket.getOutputStream());
out.writeUTF(ms);
}catch(IOException e){
System.out.println("客户的地址:54");
//return;
}
}
}
}class ServerThread extends Thread{//监听客户端消息
ArrayList<Socket> socket02 = new ArrayList<Socket>();
static int i=0;
Socket socket;
DataOutputStream out = null;
DataInputStream in = null;
String s = null;
ServerThread(Socket t){
socket = t;
if(i==0){
socket02.add(socket);
i++;
}
else{
for(int j = 0;j<i;j++){//将新的socket存入数组中
if(socket02.get(j)==socket){
break;
}
if(j==i){
socket02.add(socket);
i++;
}
}
}
try{
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}catch(IOException e){
System.out.println("程序异常");
}
}
public void run(){
while(true){
try{
String rd = in.readUTF();//监听客户端消息
System.out.println(rd);
//out.writeUTF(rd);
new message(rd,socket02,i).start();
}catch(IOException e){
System.out.println("异常错误ServerThread.run()");
return;
}
}
}
}
class starts{//监听客户端
ServerSocket server = null;
int i=0;
public void starts(){
Socket you = null;
while(true){
try{
server = new ServerSocket(2010);
}catch(IOException e){
System.out.println("正在监听");
}
try{
System.out.println("等待用户呼叫");
you = server.accept();
System.out.println("客户的地址:"+you.getInetAddress());
}catch(IOException e){
System.out.printf("11正在等待用户");
}
if(you!=null){
new ServerThread(you).start();
}
}
}
}
用数组记录下所有客户端链接的socket,当一个客户端发送消息的时候,服务端通过遍历数组中的socket
连接其他客户端转发数据包,都写完了,就差最后的连接其它客户端转发数据,我找了好久不知道怎么做,
不想用广播数据报
import java.io.*;
import java.net.*;
import java.util.*;
public class JuyuwangIP{
public static void main(String args[]){
new starts().starts();
}
}
class message extends Thread{//消息转发其他客户端机制
ArrayList<Socket> socket03 = new ArrayList<Socket>();
int i=0;
String ms;
message(String c1,ArrayList<Socket> h,int i){//传入值为“要转发的消息”“socket”“socket个数”
socket03=h; }
public void run(){ //转发具体执行
Socket mysocket = null;
DataOutputStream out = null;
for(int j=0;j<=i;j++)//循环得到socket转发
{
mysocket = socket03.get(j);
InetAddress ip = mysocket.getInetAddress();
String my = ip.toString();
String[] st = my.split("/");
my= st[1];//得到要转发至客户端的ip地址
int port = mysocket.getPort();//得到端口号
try{ //下面就是连接客户端发数据包了,总是连接失败
// mysocket.connect();
// mysocket = new Socket(ip,port);
System.out.println("客户的地址:2222");
out = new DataOutputStream(mysocket.getOutputStream());
out.writeUTF(ms);
}catch(IOException e){
System.out.println("客户的地址:54");
//return;
}
}
}
}class ServerThread extends Thread{//监听客户端消息
ArrayList<Socket> socket02 = new ArrayList<Socket>();
static int i=0;
Socket socket;
DataOutputStream out = null;
DataInputStream in = null;
String s = null;
ServerThread(Socket t){
socket = t;
if(i==0){
socket02.add(socket);
i++;
}
else{
for(int j = 0;j<i;j++){//将新的socket存入数组中
if(socket02.get(j)==socket){
break;
}
if(j==i){
socket02.add(socket);
i++;
}
}
}
try{
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}catch(IOException e){
System.out.println("程序异常");
}
}
public void run(){
while(true){
try{
String rd = in.readUTF();//监听客户端消息
System.out.println(rd);
//out.writeUTF(rd);
new message(rd,socket02,i).start();
}catch(IOException e){
System.out.println("异常错误ServerThread.run()");
return;
}
}
}
}
class starts{//监听客户端
ServerSocket server = null;
int i=0;
public void starts(){
Socket you = null;
while(true){
try{
server = new ServerSocket(2010);
}catch(IOException e){
System.out.println("正在监听");
}
try{
System.out.println("等待用户呼叫");
you = server.accept();
System.out.println("客户的地址:"+you.getInetAddress());
}catch(IOException e){
System.out.printf("11正在等待用户");
}
if(you!=null){
new ServerThread(you).start();
}
}
}
}
用数组记录下所有客户端链接的socket,当一个客户端发送消息的时候,服务端通过遍历数组中的socket
连接其他客户端转发数据包,都写完了,就差最后的连接其它客户端转发数据,我找了好久不知道怎么做,
不想用广播数据报
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货