java socket 学习

来源:互联网 发布:linux使用排行榜 编辑:程序博客网 时间:2024/05/04 12:35
package com.cn.ludyhu.masterserver;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;


public class MasterSlaver 
{
//master的IP 与 监听port
private String masterAddr = "127.0.0.1";
private int masterRegitePort = 10001;

//slaver接受任务的服务端口
private ServerSocket server; 
private int serverPort = 8081;
private Socket client; 
private BufferedReader in; 
private PrintWriter out; 

public MasterSlaver()
{

}
//连接master,注册
public void register()
{
try {
//连接master,并向其发送自己的服务端口号
Socket registSocket = new Socket(masterAddr,masterRegitePort);
String reportMsg = "i am slaver:"+serverPort;


//与master的注册连接发送流,发送自己的服务端口号
out = new PrintWriter(registSocket.getOutputStream(),true);
out.println(reportMsg);
out.flush();
registSocket.close();

System.out.println("我是slaver "+serverPort+"已经向master"+masterAddr+":"+masterRegitePort+"注册");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//启动监听服务端口,接收master调用,完成打印任务
public void start()
{
try 

server = new ServerSocket(serverPort); 
while (true) 

client = server.accept(); 
//接受master调用,开始执行打印任务
System.out.println("开始执行打印任务:");

in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
out = new PrintWriter(client.getOutputStream(),true); 

String line = in.readLine();
while (line != null) 
{
System.out.println("getTask : from master:"+line);
line = in.readLine(); 

System.out.println("任务执行完毕,服务端口为:"+serverPort);
out.println("任务执行完毕,服务端口为:"+serverPort+"---下次任务再见!---"); 
out.close();
client.close(); 


catch (IOException e) 
{
System.out.println("error:masterSlaver "+serverPort+" in method start");

}


public static void main(String[] args)
{
MasterSlaver slaver = new MasterSlaver();
slaver.register();
slaver.start();
}

}


package com.cn.ludy.master;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Map;
import java.util.Random;


//master负责两项工作,1,注册;2,分发任务。
//1,注册包括接收slaver的注册,将slaver的服务端口保存到list表中
//2,分发任务包括接收client发来的数据,交给list表中任意一个salver执行
public class Master {
//master接收client数据的端口
private int clientPort = 10000;
//master接收salver注册的端口
private int slaverPort = 10001;
//salver的注册list
private static ArrayList<Integer> slaverMap ;

public Master()
{
slaverMap = new ArrayList<Integer>();
}

public void start()
{
//启动侦听slaver线程
Thread tSlaver = new listenSlaver();
tSlaver.start();

//启动侦听client线程
Thread tClient = new listenClient();
tClient.start();
}

//侦听client
class listenClient extends Thread
{
private ServerSocket server2Client;
private Socket client; 
private BufferedReader in; 

public listenClient()
{
try {
server2Client = new ServerSocket(clientPort);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void run()
{
System.out.println("启动了一个监听client的线程");
while(true)
{
try 

client = server2Client.accept();
System.out.println("监听到一个client");
in = new BufferedReader(new InputStreamReader(client.getInputStream())); 

//获取client需要打印值
String line = in.readLine();
while (line != null) 
{
System.out.println("Master:from client:"+client.getInetAddress()+",客户端输入:"+line);

//找到空闲slaver,命令其打印
int slaverPort = slaverMap.get((int) (Math.random() * slaverMap.size()));

System.out.println("任务交给"+slaverPort);
System.out.println("任务:"+line);
Socket scoket2Slaver = new Socket("127.0.0.1",slaverPort);

PrintWriter out2Slaver = new PrintWriter(scoket2Slaver.getOutputStream(),true); ; 

out2Slaver.println("任务:"+line);
out2Slaver.flush();
scoket2Slaver.close();

line = in.readLine(); 

System.out.println("一次任务执行完毕,等待……");

client.close();

catch (IOException e) 
{
System.out.println("error:Master:start");

}
}
}
 
//侦听slaver
class listenSlaver extends Thread
{
private ServerSocket server2Slaver;
private Socket slaver; 
private BufferedReader in; 

public listenSlaver()
{
try {
server2Slaver = new ServerSocket(slaverPort);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void run()
{
System.out.println("启动了一个监听slaver的线程");
try 

while(true)
{
slaver = server2Slaver.accept();
System.out.println("有一个slaver注册成功,slaver port:"+slaver.getPort());


in = new BufferedReader(new InputStreamReader(slaver.getInputStream())); 


String line = in.readLine(); 


while (line != null) 
{
//获取slaver的port值,注册
slaverMap.add(Integer.parseInt(line.substring(12)));
System.out.println("Master:from slaver:"+slaver.getInetAddress()+":"+slaver.getPort()+",其服务端口:"+line.substring(12));
line = in.readLine(); 

slaver.close();
}

catch (IOException e) 
{
System.out.println("error:Master:listenSlaver");

}
}

public static void main(String[] args)
{
new Master().start();
}
}


package com.cn.ludy.client;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class Client 
{
Socket client; 
BufferedReader in; 
PrintWriter out; 


public Client()
{

}
public void start()
{
String localhost = "127.0.0.1";
try 
{
//连接master
client = new Socket(localhost, 10000); 
in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
out = new PrintWriter(client.getOutputStream(),true); 
BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); 

while(true)
{
String str=line.readLine();   
out.println(str);   
out.flush();   
if(str.equals("end"))
{   
break;   
}   
}

catch (IOException e) 
{
System.out.println("error:client:start");
}
}

public static void main(String[] args)
{
new Client().start();
}


}

原创粉丝点击